1. 程式人生 > >使用VC庫函式中的快速排序函式

使用VC庫函式中的快速排序函式

               

上一篇講了快速排序的實現。但在很多場合,直接使用快速排序的庫函式是很方便的。下面講下VC中庫函式qsort()的用法:

函式原型:

void qsort(void *base,size_t num,size_t width, int (__cdecl *compare )(const void *, const void *) );

第一個是陣列地址,第二是陣列大小,第三個是陣列中每個元素的位元組數,最後一個是個函式指標,表示如何比較陣列中的元素。

標頭檔案 #include <stdlib.h>

下面分別就int等整數資料,double等浮點資料,結構體和類,按指定方式這四種情況進行講解。

例項1   對int等整數資料進行排序

int cmp(const void *x, const void *y)return *(int*)x - *(int*)y;}qsort(a, MAXN, sizeof(a[0]), cmp); 

MAXN為陣列大小,下同

例項2   對double等浮點數進行排序

int cmpDouble(const void *x, const void *y)return (*(double*)x > *(double*)y ? 1 : -1);}qsort(a, n, sizeof(a[0]), cmpDouble);

例項3  對結構體,類等複雜資料進行排序

struct Student{ char szName[30]; int  nAge;};

先對年齡排序,年齡相同再按姓名排序。

int cmpStudent (const void *x, const void *y){   //先作下指標轉換,再按要求比較 Student *pNodex = (Student*)x, *pNodey = (Student*)y; if (pNodex->nAge != pNodey->nAge)  return pNodex->nAge - pNodey->nAge; else  return strcmp(pNodex->szName, pNodey->szName);}qsort(a, n, sizeof
(a[0]), cmpStudent);

例項4     按指定方式進行排序。

如對只有大小寫字母的字串"AajkuKdYUBCDwyz"進行排序,要求大寫字母在前,小寫字母在後。

int cmp1(const void *x, const void *y)char *pcx = (char*)x, *pcy = (char*)y; bool flag1 = *pcx >= 'A' && *pcx <= 'Z'bool flag2 = *pcy >= 'A' && *pcy <= 'Z'if(flag1 == flag2)    //如果都為大寫字母或都為小寫字母  return *pcx - *pcy; else                  //否則,誰為大寫字母,誰的權值小。  return flag1 ? -1 : 1;}int main()char szText[] = "AajkuKdYUBCDwyz"; qsort(szText, strlen(szText), sizeof(szText[0]), cmp1); printf("%s\n", szText); return 0;}