轉!
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()
int main()
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()
s[100];
int i,n;
int cmp(const void *a,const void *b)
int main()
no.7.對字串陣列的排序(char s型)
#include
#include
#include
char s[100][100];
int i,n;
int cmp(const void *a,const void *b)
int main()
int main()
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,包含在stdlib.h標頭檔案裡,函式一共四個引數,沒返回值.乙個典型的qsort的寫法如下 qsort s,n,sizeof s 0 cmp 其中第乙個引數是參與排序的陣列名 或者也可以理解成開始排序的位址,因為可以寫 s i 這樣的表示式,這個問題下面有說明 ...
C語言 qsort()的用法。
使用qsort 函式,必須要引用 include qsort void base,int sz,int width,int cmp void e1,void e2 base為要排列物件的起始位址 sz為要排列物件的總數 width為每個資料元素的寬度 位元組數 cmp為排列的函式指標,指向函式形參 ...