C語言qsort的用法

2021-08-10 18:33:08 字數 3330 閱讀 3200

** 關於快排函式的一些說明 **

qsort,包含在stdlib.h標頭檔案裡,函式一共四個引數,沒返回值.乙個典型的qsort的寫法如下

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

其中第乙個引數是參與排序的陣列名(或者也可以理解成開始排序的位址,因為可以寫&s[i]

這樣的表示式,這個問題下面有說明); 第二個引數是參與排序的元素個數; 第三個三數是

單個元素的大小,推薦使用sizeof(s[0])這樣的表示式,下面也有說明 :) ;第四個引數就是

很多人覺得非常困惑的比較函式啦,關於這個函式,還要說的比較麻煩...

我們來討論cmp這個比較函式(寫成cmp是我的個人喜好,你可以隨便寫成什麼,比如qcmp什麼

的).典型的cmp的定義是

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

返回值必須是int,兩個引數的型別必須都是const void *,那個a,b是我隨便寫的,個人喜好.

假設是對int排序的話,如果是公升序,那麼就是如果a比b大返回乙個正值,小則負值,相等返回

0,其他的依次類推,後面有例子來說明對不同的型別如何進行排序.

在函式體內要對a,b進行強制型別轉換後才能得到正確的返回值,不同的型別有不同的處理

方法.具體情況請參考後面的例子.

** 關於快排的一些小問題 **

1.快排是不穩定的,這個不穩定乙個表現在其使用的時間是不確定的,最好情況(o(n))和最

壞情況(o(n^2))差距太大,我們一般說的o(nlog(n))都是指的是其平均時間.

2.快排是不穩定的,這個不穩定表現在如果相同的比較元素,可能順序不一樣,假設我們有

這樣乙個序列,3,3,3,但是這三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定

就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(no.6的例子就

是說明這個問題的)

3.快排的比較函式的兩個引數必須都是const void *的,這個要特別注意,寫a和b只是我的

個人喜好,寫成cmp也只是我的個人喜好.推薦在cmp裡面重新定義兩個指標來強制型別轉換,

特別是在對結構體進行排序的時候

4.快排qsort的第三個引數,那個sizeof,推薦是使用sizeof(s[0])這樣,特別是對結構體,

往往自己定義2*sizeof(int)這樣的會出問題,用sizeof(s[0)既方便又保險

5.如果要對陣列進行部分排序,比如對乙個s[n]的陣列排列其從s[i]開始的m個元素,只需要

在第乙個和第二個引數上進行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);

** 標程,舉例說明 **

no.1.手工實現quicksort

#include

int a[100],n,temp;

void quicksort(int h,int t)

a[mid]=a[j];

a[j]=x;

quicksort(h,j-1);

quicksort(j+1,t);

return;

}int main()

no.2.最常見的,對int陣列排序

#include

#include

#include

int s[10000],n,i;

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

int main()

no.3.對double型陣列排序,原理同int

這裡做個注釋,本來是因為要判斷如果a==b返回0的,但是嚴格來說,兩個double數是不可能相等的,只能說fabs(a-b)<1e-20之類的這樣來判斷,所以這裡只返回了1和-1

#include

#include

double s[1000];

int i,n;

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

int main()

no.4.對乙個字元陣列排序.原理同int

#include

#include

#include

char s[10000],i,n;

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

int main()

no.5.對結構體排序

注釋一下.很多時候我們都會對結構體排序,比如校賽預選賽的那個櫻花,一般這個時候都在

cmp函式裡面先強制轉換了型別,不要在return裡面轉,我也說不清為什麼,但是這樣程式會

更清晰,並且絕對是沒錯的. 這裡同樣請注意double返回0的問題

#include

#include

struct node

s[100];

int i,n;

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

int main()

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

for(i=0;i

%lf\n",s[i].no,s[i].date1);

return(0);

}no.6.對結構體排序.加入no來使其穩定(即data值相等的情況下按原來的順序排)

#include

#include

struct node

s[100];

int i,n;

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

int main()

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

for(i=0;i

%lf\n",s[i].no,s[i].date1);

return(0);

}no.7.對字串陣列的排序(char s型)

#include

#include

#include

char s[100][100];

int i,n;

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

int main()

no.8.對字串陣列排序(char *s型)

#include

#include

#include

char *s[100];

int i,n;

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

int main()

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

for(i=0;i

return(0);

}

C語言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 con...

C語言 qsort()的用法。

使用qsort 函式,必須要引用 include qsort void base,int sz,int width,int cmp void e1,void e2 base為要排列物件的起始位址 sz為要排列物件的總數 width為每個資料元素的寬度 位元組數 cmp為排列的函式指標,指向函式形參 ...

C語言qsort的用法

轉!qsort,包含在stdlib.h標頭檔案裡,函式一共四個引數,沒返回值.乙個典型的qsort的寫法如下 qsort s,n,sizeof s 0 cmp 其中第乙個引數是參與排序的陣列名 或者也可以理解成開始排序的位址,因為可以寫 s i 這樣的表示式,這個問題下面有說明 第二個引數是參與排序...