快排函式的呼叫

2021-09-09 07:11:50 字數 2272 閱讀 9727

**自:

主要講的是怎樣呼叫系統提供的快排庫函式:qsort,它包含在標頭檔案裡,函式一共四個引數,在函式頭部加上#include,就可以直接呼叫,並且無需宣告。乙個典型的qsort的寫法如下:

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

其中第乙個引數s是參與排序的陣列名(或者也可以理解成開始排序的位址,因為可以寫成&s[i]這樣的表示式,這個問題下面有說明);第二個引數n是參與排序的元素個數; 第三個引數是單個元素的大小,必須sizeof(s[0])這樣的表示式,下面也有說明;第四個引數cmp其實是個函式名字,它是為指導qsort如何進行排序而專門寫的乙個函式,我們稱之為比較函式,其目的是為了告訴qsort要以什麼樣的方式進行排序(降序?公升序?或者按照某個關鍵字進行排序等)(注:寫成cmp只是乙個名字,可以隨便怎麼寫),cmp這個函式有形參,和返回值(int型),但是在呼叫時卻不需要給它傳遞實參進去,直接呼叫其名字即可,這個函式是專門為qsort開發的一種函式形式,這個函式的典型定義是:

intcmp(const void *a,const void*b);(紅色字型是其固定模式,必須這樣寫,黑色的則是自己隨便起的名字)(其函式體詳見後面),並且規定這個函式只能返回int型值。

關於快排的一些小問題

1.快排的複雜度,當元素個數比較少時(10^2的數量級左右),快排的速度跟冒泡相比並沒有快很多,還有如果要排序的元素大部分都已經是排好順序了時,快排效率會下降,但是其最壞情況是n^2(當元素全部是已經排好的順序時),一般情況(也即平均效率)是n*log2(n),最好情況是n(當元素全部是逆序時),快排的特點是元素越亂排序速度越快,所以可以看出,雖然元素少時使用快排並沒有很大優勢,但是在快排的最壞情況跟冒泡、選擇排序(冒泡、選擇排序其複雜度不受元素順序影響,永遠為n^2)一樣,所以快排永遠是最快的。

2.快排是不穩定的,這裡的穩定性是指對於相同元素的處理上,快排會打亂相同元素的先後順序(原因就在於快排排序原理,其排序過程是不斷把元素分組打亂進行的),當然如果單純排序一列數字是沒什麼區別的,假設我們有這樣一列數字3,3,3,但是三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(no.5的例子就是說明這個問題的)

3.快排的比較函式cmp的兩個引數必須都是constvoid *的,這個要特別注意,寫a和b只是個人喜好,寫成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);

注:以下所有程式都已經在visual studio2008上編譯通過

#include

#include

#include

int s[10000],n,i;

intcmp(const void *a, const void *b)

voidmain()

void main()

intmain()

#include

#include

struct node

s[100];

int i,n;

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

intmain()

s[100];

int i,n;

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

intmain()

voidmain()

intmain()

int main()

//呼叫快速排序

qsort(array,25,sizeof(int),compare);

puts("排序後:");

for(i=0;i<5;i++)

return 0;

}關於對二維陣列每行元素的排序:

#include

#include

#include

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

int main()

//呼叫快速排序

for(i=0;i<5;i++)

qsort(array[i],5,sizeof(int),compare);

puts("排序後:");

for(i=0;i<5;i++)

return 0;

快排函式的呼叫

int cmp const void a,const void b 返回正數就是說 cmp 傳入引數第乙個要放在第二個 後面,負數就是傳入引數第乙個要放第二個 前面,如果是0,那就無所謂誰前誰後.下面就把 snoopy 曾經寫的介紹 qsort 的完整版貼出來好了 我想有與我一樣經歷的朋友也可以弄懂...

呼叫快排函式總結

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