int cmp(const void *a, const void *b)
返回正數就是說
cmp
傳入引數第乙個要放在第二個
後面,
負數就是傳入引數第乙個要放第二個
前面,
如果是0,
那就無所謂誰前誰後..
下面就把
snoopy
曾經寫的介紹
qsort
的完整版貼出來好了
,我想有與我一樣經歷的朋友也可以弄懂的:
很多人問這個東西
.我以前也看了好久
,今天翻到以前學快排的時候寫的練習
code,
基本上能覆蓋絕大部分用法了
.裡面有很多地方沒判斷相等的情況
,按道理來說相等情況下應該返回0的
,這個請看**的
時候注意
.我盡量保證**不出錯了
.下面的這些說明和問題都是個人原創
,沒查什麼資料
,所以不保證其完全正確性
,在此表示個
人不對出現的問題負任何責任,大家
wa了或者幹嗎的不要怪我
,不過至少目前來說我用起來
是沒問題的
:)**
關於快排函式的一些說明
**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()
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()
int main()
int main()
快排函式的呼叫
自 主要講的是怎樣呼叫系統提供的快排庫函式 qsort,它包含在標頭檔案裡,函式一共四個引數,在函式頭部加上 include,就可以直接呼叫,並且無需宣告。乙個典型的qsort的寫法如下 qsort s,n,sizeof s 0 cmp 其中第乙個引數s是參與排序的陣列名 或者也可以理解成開始排序的...
呼叫快排函式總結
快速排序 標頭檔案 include 函式 qsort 首位址,數目,單個元素位元組大小,方法 公升序 降序 例項 陣列 include includeusing namespace std int order const void a,const void b int reorder const v...
C C 呼叫快排的模板
在進行c c 程式設計的時候,c c 的庫函式中已經提供了快速排序法的函式qsort,我們只需要呼叫它就可以了。qsort函式在標頭檔案stdlib.h中。要使用qsort函式,就必須加 include 對c語言來說 或加入 include 對c 來說 下面是7種快排呼叫方法 注意下面的都是從小到大...