使用VC庫函式中的快速排序函式
阿新 • • 發佈:2018-12-19
上一篇講了快速排序的實現。但在很多場合,直接使用快速排序的庫函式是很方便的。下面講下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;}