排序函式qsort和sort

2021-08-08 18:22:20 字數 3481 閱讀 7932

qsort函式、sort函式 (精心整理篇)

文件**:

先說明一下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()

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(){

int i;

int a[20];

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

cin>>a[i];

sort(a,a+5,cmp);          //範圍,很明顯這裡是a+5 注意,這是必要的,如果是a+4最後乙個值a[4]就不會參與排序。

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

cout<

對二維陣列的排序:

#include

#include

#include

using namespace std;

bool cmp(int *p,int *q)

{if(p[0]==q[0])

{if(p[1]==q[1])

{return p[2]

排序庫函式sort 和qsort

sort是stl中提供的演算法,標頭檔案為 include以及using namespace std 函式原型如下 template void sort randomaccessiterator first,randomaccessiterator last template void sort r...

qsort函式和sort函式

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

qsort函式 sort函式

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