qsort()函数详解
一、寫在開頭
? ? 1.1 本節內容
? ? ? ?學習C語言中的qsort()函數。
二、qsort()
? ? 2.1 函數原型
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *) );? ? ? ?函數功能:qsort()函數的功能是對數組進行排序,數組有nmemb個元素,每個元素大小為size。
? ? ? ?參數base? ? ?-base指向數組的起始地址,通常該位置傳入的是一個數組名
? ? ? ?參數nmemb -nmemb表示該數組的元素個數
? ? ? ?參數size? ? ? ?-size表示該數組中每個元素的大小(字節數)
? ? ? ?參數(*compar)(const void *, const void *)? - 此為指向比較函數的函數指針,決定了排序的順序。
? ? ? ?函數返回值:無。
? ? ? ?注意:如果兩個元素的值是相同,那么它們的前后順序是不確定的。也就是說qsort()是一個不確定的排序算法。
? ? 2.2 compar參數
? ? ? ?compar參數指向一個比較兩個元素的函數。比較函數的原型應該像下面這樣,注意兩個形參必須是const void *型,同時在調用compar函數(compar實質為函數指針,這里稱它所指向的函數也為compar)時,傳入的實參也必須轉換成const void *型。在compar函數內部會將const void *型轉換成實際類型,見下文:
int compar(const void *p1, const void *p2);? ?如果compar返回值小于0(<0),那么p2所指向元素會被排在p2所指向元素的前面
? ?如果compar返回值等于0(=0),那么p2所指向元素與p2所指向元素的順序不確定
? ?如果compar返回值大于0(>0),那么p1所指向元素會被排在p2所指向元素的后面
? ?因此,如果想讓qsort()進行從小到大(升序)排序,那么一個通用的compar函數可以寫成這樣:
int compareMyType(const void *a, const void *b) {if (*(MyType *)a < *(MyType *)b) return -1;if (*(MyType *)a == *(MyType *)b) return 0;if (*(MyType *)a > *(MyType *)b) return 1; }? ? 注意:你要將MyType換成實際數組元素的類型。
? ? 2.3 一個使用qsort()函數的小例子
/* qsort example */ #include <stdio.h> /* printf */ #include <stdlib.h> /* qsort */int values[] = { 40, 10, 100, 90, 20, 25 };int compare (const void *a, const void *b) {return (*(int *)a - *(int *)b); }int main() {int n;qsort(values, 6, sizeof(int), compare);for (n=0; n<6; n++) printf("%d ", values[n]);return 0; }? ? ? ? 分析一個compare函數。如果a小于b,則返回值為負數(<0),也即a會排在b的前面。同理,若a大于b,則a會排在b的前面。所以,這里的qsort()為從小到大即升序排序。因此,運行結果為:10 20 25 40 90 100
? ? 2.4 修改compare(), 使qsort()為降序排序
? ? ? 很簡單,只要將上面compare()中的
return (*(int *)a - *(int *)b);? ? ? ? 改為:
return (*(int *)b - *(int *)a);三、參考資料
? ? ?1.?qsort - C++ Reference
? ? ?2.man qsort
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的qsort()函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Cocos2d-x3.x游戏开发之旅》
- 下一篇: 学习《apache源代码全景分析》之DS