qsort函式 sort函式

2021-07-30 02:11:45 字數 3554 閱讀 7105

先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。

首先說一下, qsort

qsort(基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定)。整合在c語言庫函式裡面的的qsort函式,使用 三 路劃分的方法解決排序這個問題。所謂三路劃分,是指把陣列劃分成小於劃分值,等於劃分值和大於劃分值的三個部分。

具體介紹:-^^

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )

int compare (const void *elem1, const void *elem2 ) );

qsort(即,quicksort)主要根據你給的比較條件給乙個快速排序,主要是通過指標移動實現排序功能。排序之後的結果仍然放在原來陣列中。

引數意義如下:

第乙個引數 base 是 需要排序的目標陣列名(或者也可以理解成開始排序的位址,因為可以寫&s[i]這樣的表示式)

第二個引數 num 是 參與排序的目標陣列元素個數

第三個引數 width 是單個元素的大小(或者目標陣列中每乙個元素長度),推薦使用sizeof(s[0])這樣的表示式

第四個引數 compare 就是讓很多人覺得非常困惑的比較函式啦。

我們來簡單討論compare這個比較函式(寫成compare是我的個人喜好,你可以隨便寫成什麼,比如 cmp 什麼的,在後面我會一直用cmp做解釋)。 典型的compare的定義是int compare(const void *a,const void *b);

返回值必須是int,兩個引數的型別必須都是const void *,那個a,b是隨便寫的,個人喜好。假設是對int排序的話,如果是公升序,那麼就是如果a比b大返回乙個正值,小則負值,相等返回0,其他的依次類推,後面有例子來說明對不同的型別如何進行排序。

qsort 的使用方法:

一、對int型別陣列排序

int num[100];

int cmp ( const

void *a , const

void *b )

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

示例完整函式(已在 vc6.0上執行通過):

#include 

#include

#include

int s[10000],n,i;

int cmp(const

void *a,const

void *b)

int main()

二、對char型別陣列排序(同int型別)

char word[100];

int cmp( const

void *a , const

void *b )

qsort(word,100,sizeof(word[0]),cmp);

//附,可能 getchar(); 會派上用場

三、對double型別陣列排序(特別要注意)

double

in[100];

int cmp( const

void *a , const

void *b )

qsort(in,100,sizeof(in[0]),cmp);

//附:排序結果的輸出,一般建議用 「 %g 」 格式

/* 在這裡多嘴一句,"%g"格式輸出 雖然書上是說系統會自動選擇 " %f " 格式 和 " %e " 格式 中長度較短的格式,並去掉無意義的0,但實際上系統如果選擇了" %e ",系統會輸出比 「 %e " 格式更省一位的格式輸出。(此結論,來自vc6.0的實際操作)*/

四、對結構體一級排序

struct in

s[100]

//按照data的值從小到大將結構體排序,關於結構體內的排序關鍵資料data的型別可以很多種,參考上面的例子寫

int cmp( const

void *a ,const

void *b)

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

五、對結構體二級排序

struct in

s[100];

//按照x從小到大排序,當x相等時按照y從大到小排序。 你可以想象成:失敗是主要因素的乙個問題,先比較 失敗次數少,失敗次數相同 再看 成功次數多。

int cmp( const

void *a , const

void *b )

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

六、對字串進行排序

struct in

s[100];

//按照結構體中字串str的字典順序排序

int cmp ( const

void *a , const

void *b )

qsort

(s,100,sizeof(s[0]),cmp);

//注意!qsort 中的 cmp 得自己寫 。

再說說 sort (常用於 c++ )

sort 使用時得註明:using namespace std; 或直接打 std::sort() 還得加上 #include 標頭檔案

例:

#include

#include

using

namespace

std;

int main()

std::sort是乙個改進版的qsort. std::sort函式優於qsort的一些特點:對大陣列採取9項取樣,更完全的三路劃分演算法,更細緻的對不同陣列大小採用不同方法排序。

最後,我們來說說sort、qsort的區別:

sort是qsort的公升級版,如果能用sort盡量用sort,使用也比較簡單,不像qsort還得自己去寫 cmp 函式,只要註明 使用的庫函式就可以使用,引數只有兩個(如果是普通用法)頭指標和尾指標;

預設sort排序後是公升序,如果想讓他降序排列,可以使用自己編的cmp函式

#include

#include

using

namespace

std;

int cmp(int a,int b)

int main()

對二維陣列的排序:

#include 

#include

#include

using namespace std;

bool cmp(int

*p,int

*q) else

return p[1]}

else

return p[0]}int main()

sort(a,a+1000,cmp);

/*cout<<"after sort"0;}

**:

qsort函式 sort函式

先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的的qsort函式,使用...

qsort函式 sort函式

qsort函式 sort函式 精心整理篇 先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合...

qsort函式和sort函式

做acm題的時候,排序是一種經常要用到的操作。如果每次都自己寫個冒泡之類的o n 2 排序,不但程式容易超時,而且浪費寶貴的比賽時間,還很有可能寫錯。stl裡面有個sort函式,可以直接對陣列排序,複雜度為n log2 n 使用這個函式,需要包含標頭檔案 include 這個函式可以傳兩個引數或三個...