函數原型:
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;
}