qsort与sort()
生活随笔
收集整理的這篇文章主要介紹了
qsort与sort()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
int cmp(const void *a, const void *b)
/** 關于快排函數的一些說明 **qsort,包含在stdlib.h頭文件里,函數一共四個參數,沒返回值.一個典型的qsort的寫法如下qsort(s,n,sizeof(s[0]),cmp);其中第一個參數是參與排序的數組名(或者也可以理解成開始排序的地址,因為可以寫&s[i]
這樣的表達式,這個問題下面有說明); 第二個參數是參與排序的元素個數; 第三個三數是
單個元素的大小,推薦使用sizeof(s[0])這樣的表達式,下面也有說明 :) ;第四個參數就是
很多人覺得非常困惑的比較函數啦,關于這個函數,還要說的比較麻煩...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的例子就
是說明這個問題的)5.如果要對數組進行部分排序,比如對一個s[n]的數組排列其從s[i]開始的m個元素,只需要
在第一個和第二個參數上進行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);
*/
//int型
int qcmp(const void*a,const void *b)
{return *(int *)a-*(int *)b;//升序排列。//return *(int *)b-*(int *)a;降序排列
}
//char
int qcmp(const void *a,const void *b)
{return(*(char *)a-*(char *)b);//升序
}
//char [][]
int qcmp(const void *a,const void *b)
{return(strcmp((char*)a,(char*)b));//升序
}
//double型
int qcmp(const void *a,const void *b)
{return *(double*)a > *(double*)b ? 1:-1;//升序//返回值的問題,顯然qcmp返回的是一個整型,所以避免double返回小數而被丟失,用一個判斷返回值。
}
//struct型
struct node
{int num;int index;
};
int qcmp(const node &a,const node &b)
{switch(mode)//都是升序{case 1:return a.num-b.num;case 2:return a.index-b.index;}
}//sort排序
bool compare(int a,int b)
{return a>b; //降序排列,如果改為return a<b,則為升序
}
//同是降序,sort的comp函數是a>b而qsort的函數是return b-a;
總結
以上是生活随笔為你收集整理的qsort与sort()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdut-1118 C语言实验——从大到
- 下一篇: STL_vector