關於qsort中的cmp函式 網上摘錄

2021-06-16 04:48:05 字數 2617 閱讀 9172

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與sort函式中cmp的編寫方法與解析

在使用c c 語言進行程式設計時,為了方便起見,我們在排序時經常呼叫系統提供的排序函式來完成部分排序功能,本文將介紹qsort與sort函式的用法,尤其是其cmp函式的編寫方法。c語言中,編譯器函式庫自帶的快速排序函式。標頭檔案 stdlib.h qsort 的函式原型是void qsort voi...

sort 和qsort函式cmp函式各種寫法

用sort 函式,要加標頭檔案以及using namespace std 另外檔案的字尾要改為.cpp 用qsort函式,要加標頭檔案這個是c裡的,檔案的字尾可以是.c int型 sort函式 int cmp int a,int b return a b 從大到小 return aqsort函式 i...

關於cmp函式引數中的 符號

關於sort函式中的cmp函式有著不同的寫法,以剛剛的整形元素比較為例 還有人是這麼寫的 bool cmp const int a,const int b int a 10 sort a,a 10,cmp 思考 int 和const int 有什麼區別呢?原來 作為函式引數 int這種寫法是值傳遞,...