C語言標準庫函式qsort詳解

2021-06-22 18:13:14 字數 3508 閱讀 7673

功 能: 使用快速排序例程進行排序

標頭檔案:stdlib.h

用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

引數: 1 待排序陣列首位址

2 陣列中待排序元素數量

3 各元素的占用空間大小

4 指向函式的指標,用於確定排序的順序

使用qsort()排序並用 bsearch()搜尋是乙個比較常用的組合,使用方便快捷。

qsort 的

函式原型

是void __cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))

其中base是排序的乙個集合陣列,num是這個陣列元素的個數,width是乙個元素的大小,comp是乙個比較函式。

比如:對乙個長為1000的陣列進行排序時,int a[1000]; 那麼base應為a,num應為 1000,width應為 sizeof(int),comp函式隨自己的命名。

qsort(a,1000,sizeof(int),comp);

其中comp函式應寫為:

上面是由小到大排序,return *(int *)b-*(int *)a; 為由大到小排序。

是對乙個

二維陣列

的進行排序:

int a[1000][2]; 其中按照a[0]的大小進行乙個整體的排序,其中a[1]必須和a[0]一起移動交換。

qsort(a,1000,sizeof(int)*2,comp);

int comp(const void *a,const void *b)

qsort函式是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分發寫的,其時間複雜度為n*log(n),其結構為:

void qsort(void *base,size_t nelem,size_t width,int (*comp)(const void *,const void *));

其中:

*base 為要排序的陣列

nelem 為要排序的陣列的長度

width 為陣列元素的大小(一位元組為單位)

預設是從小到大排序的!

(* comp)(const void *p1,const void *p2) 為判斷大小函式的指標,這個函式需要自己定義,如果p1>p2,函式返回-1;a

排序方法有很多種:選擇排序,氣泡排序,歸併排序,快速排序等。

看名字都知道快速排序 是目前公認的一種比較好的排序演算法(我沒聽說速度比這快的了,特殊場合例外),比選擇排序,氣泡排序都要快。這是因為他速度很快,所以系統也在庫里實現這個演算法,便於我們的使用。

這就是qsort。

qsort 要求提供乙個比較函式,是為了做到通用性更好一點。比如你不僅僅的是要排序乙個數字而已,可能你要用來排序幾個數字 ,比如有乙個結構

struct num

;

然後我有乙個num 型別的陣列, num dddd[100];

我想給 dddd這個陣列排序,那怎麼辦? 我想讓 a +b 最大的num元素排在陣列的最前面,那又怎麼辦?

這都可以通過定義比較函式來做到的。

比較函式的作用就是給qsort指明元素的大小是怎麼比較的。

像這樣的比較函式 inline int mycmp(const void* a, const void* b) 

都是有兩個元素作為引數,返回乙個int值, 如果比較函式返回大於0,qsort就認為 a>b , 如果比較函式返回等於0 qsort就認為a 和b 這兩個元素相等,返回小於零 qsort就認為 a

qsort 知道元素大小,就可以把大的放到前面去。

如果你的比較函式放回本來應該是1 的(a>b),你比較函式卻返回乙個 -1 (小於零的)那麼qsort認為a

七種qsort排序方法 

《本文中排序都是採用的從小到大排序》 

一、對int型別陣列排序 

int num[100]; 

sample: 

int cmp ( const void *a , const void *b ) 

qsort(num,100,sizeof(num[0]),cmp); 

二、對char型別陣列排序(同int型別) 

char word[100]; 

sample: 

int cmp( const void *a , const void *b ) 

qsort(word,100,sizeof(word[0]),cmp); 

三、對double型別陣列排序(特別要注意) 

double in[100]; 

int cmp( const void *a , const void *b ) 

qsort(in,100,sizeof(in[0]),cmp); 

四、對結構體一級排序 

struct in 

s[100];

//按照data的值從小到大將結構體排序,關於結構體內的排序關鍵資料data的型別可以很多種,參考上面的例子寫 

int cmp( const void *a ,const void *b) 

qsort(s,100,sizeof(s[0]),cmp); 

五、對結構體二級排序 

struct in 

s[100]; 

//按照x從小到大排序,當x相等時按照y從大到小排序 

int cmp( const void *a , const void *b ) 

qsort(s,100,sizeof(s[0]),cmp); 

六、對字串進行排序 

struct in 

s[100]; 

//按照結構體中字串str的字典順序排序 

int cmp ( const void *a , const void *b ) 

qsort(s,100,sizeof(s[0]),cmp); 

七、計算幾何中求凸包的cmp 

int cmp(const void *a,const void *b) //重點cmp函式,把除了1點外的所有點,旋轉角度排序 

ps: 

其中的qsort函式包含在的標頭檔案裡,strcmp包含在的標頭檔案裡

標準庫函式qsort排序

qsort函式包含在的標頭檔案裡。qsort函式宣告如下 void qsort void base,size t nmemb,size t size,int compar const void const void 引數說明如下 base 要排序的陣列 nmemb 陣列中的元素數目 size 每個陣...

C 中標準庫函式 qsort 的用法

一 c語言函式庫 對qsort的說明 p110 qsort 快速排序函式 函式原型 void qsort void base,int nelem,int width,int fcmp const void const 標頭檔案 include 是否是標準函式 是 函式功能 對記錄 進行從小到大的快速...

C語言標準庫函式qsort排序的介紹與使用

qsort函式包含在的標頭檔案裡。qsort函式宣告如下 void qsort void base,size t nmemb,size t size,int compar const void const void 引數說明如下 base 要排序的陣列 nmemb 陣列中的元素數目 size 每個陣...