qsort 函式詳解

2021-08-29 15:47:17 字數 1762 閱讀 1281

一、寫在開頭

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...