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函式,使用...