快排函式的呼叫

2021-06-09 02:16:47 字數 3819 閱讀 9696

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種快排呼叫方法 注意下面的都是從小到大...