一、寫在開頭
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)
注意:你要將mytype換成實際陣列元素的型別。
2.3 乙個使用qsort()函式的小例子
/* qsort example */
#include /* printf */
#include /* qsort */
int values = ;
int compare (const void *a, const void *b)
int main()
分析乙個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函式詳解
qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的的qsort函式,使用 三 路劃分的方法解決排序這個問題。所謂三路劃分,是指把陣列劃分成小於劃分值,等於劃分值和大於劃分值的三個部分。具體介...
qsort函式和bsearch函式詳解
qsort 包含在標頭檔案中,此函式 根據給的比較條件進行快速排序,排序之後的結果仍然放在原陣列中,需要自己寫乙個比較函式。函式原型 void qsort void base,size t num,size t size,int comparator const void const void ba...
C語言qsort函式詳解
qsort函式是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分發寫的,其時間複雜度為n log n 其結構為 void qsort void base,size t nelem,size t width,int comp const void const void 其中 bas...