目錄
簡介
?頭文件
?編輯?函數原型:
參數函數如何寫:
參數函數要求:
qsort對整性數據的排序:
qsort對字符型數據的排序:
對結構體類型的內部元素排序:
函數的底層是以快速排序實現的?
?但是本文不深入探討快速排序是如何進行的,你可以從上面的動圖可以有個大致了解。
?
一,簡介
qsort函數(quick sort)是八大排序算法中的快速排序,能夠排序任意數據類型的數組其中包括整形,浮點型,字符串甚至還有自定義的結構體類型。?
?二,頭文件<stdlib.h>
?三,函數原型:
void qsort (void* base,//要排序的對象的第一個元素的首地址size_t num, //對象的個數size_t size,//每一個對象的大小 Size in bytesint (*compar)(const void*,const void*));//Pointer to a function that compares two elements.(并且這個函數要自己寫)
四,參數函數如何寫:
4.1參數函數要求:
必須與qsort函數的第四個參數的函數指針的類型相同
????????兩個參數是兩個空類型的指針
????????返回值為整形,對于元素來說:
????????如果值小于0,第一個小于第二個;
????????如果值等于0,第一個等于第二個;
????????如果值大于0,第一個大于第二個;
(這些比較都是以你定義的函數為標準,而比較出來的)
五,具體實例
5.1 qsort對整性數據的排序:
//兩個整形元素比較可以用><=來比較
int in_cmp(const void* a,const void* b)
{return *((int*)a) - *((int*)b);//void*不可直接解引用
}
int main1()
{int arr[8] = {5,8,9,4,3,2,8,1};qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),in_cmp);for(int i = 0;i < 8;i++){printf("%d ",arr[i]);}return 0;
}
?著重點:
1.qsort函數第四個參數(函數指針的類型)與庫函數完全一致;
2.傳入的元素的個數,每個元素的大小都可以借助sizeof操作符實現;
3.其余注意寫在代碼注釋中;
5.2 qsort對字符型數據的排序:
//比較兩個字符,字符在內存中以ASCII、碼存儲,可用<>=比較int ch_cmp(const void* ach,const void* bch)
{return *(char*)ach - *(char*)bch;//強制類型轉化為char*
}
int main2()
{char *str = "hisndksni";//str為字符串常量,不能被改變char p[10];//可以創建字符數組,把str內容copy過來memcpy(p,str,10);int len = strlen(str);qsort(p,len,sizeof(char),ch_cmp);printf("%s",p);return 0;
}
?注重點:
1.對字符串排序,結尾的\0可忽略,所以可用strlen計算元素的個數;
2.字符串常量不能被改變,初始化時要注意;
5.3 對結構體類型的內部元素排序:
struct stu
{int score;char* name;int hight;
};int stu_cmp_by_score(const void* p1,const void* p2)
{return ((struct stu*)p1)->score - ((struct stu*)p2)->score;
}
int main()
{struct stu arr[]= {{90,"zhangsan",175},{88,"lisi",180}};int sz1 = sizeof(arr)/sizeof(arr[0]);qsort(arr,sz1,sizeof(arr[0]),stu_cmp_by_score);for(int i = 0;i < sz1;i++){printf("%d ",arr[i].score);}return 0;
}
?1.結構體指針寫完整;
2.適當的用括號讓自己的代碼邏輯更加清晰;
cplusplus的qort函數https://legacy.cplusplus.com/reference/cstdlib/qsort/?kw=qsort
完~
未經作者同意禁止轉載