C中的qsort函數和C++中的sort函數的理解與使用

1、qsort()函數

原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));c++

參數解釋:一、待排序數組首地址;二、數組中待排序元素數量;三、各元素的佔用空間的大小;四、指向函數的指針,用於肯定排序的順序。算法

說明:qsort函數是ANSI C標準中提供的,其聲明在stdlib.h文件中,是根據二分法寫的,時間複雜度爲O(n*logn)。數組

qsort要求提供比較函數用來肯定排序的順序(升序、降序),比較函數使得qsort通用性更好,能夠對數組、字符串、結構體數進行排序。如int cmp(const void *a, const void *b)中有兩個元素做爲參數(參數的格式不能變的。)返回一個int值,若是比較函數返回大於0,qsort就認爲a > b,返回小於0,qsort就認爲a < b。less

一、qsort中幾種常見的cmp函數

1.一、對int類型數組排序函數

int num[100]; int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } qsort(num, 100, sizeof(int), cmp);

1.二、對char類型數組排序性能

char num[100]; int cmp(const void *a, const void *b) { return *(char *)a - *(char *)b; } qsort(num, 100, sizeof(char), cmp);

1.三、對double類型數組排序測試

double num[100]; int cmp(const void *a, const void *b) { return *(double *)a > *(double *)b; } qsort(num, 100, sizeof(double), cmp);

1.四、對結構體數組一級排序優化

struct In { double data; int other; }s[100] //按照data的值從小到大將結構體排序,關於結構體內的排序關鍵數據data的類型能夠不少種,參考上面的例子寫 
int cmp( const void *a ,const void *b) { return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1; } qsort(s,100,sizeof(In),cmp); 

1.五、對結構體數組二級排序spa

struct In { int x; int y; }s[100]; //按照x從小到大排序,當x相等時按照y從大到小排序 
int cmp( const void *a , const void *b ) { struct In *c = (In *)a; struct In *d = (In *)b; if(c->x != d->x) return c->x - d->x; else
        return d->y - c->y; } qsort(s,100,sizeof(In),cmp); 

1.六、對字符串進行排序指針

struct In { int data; char str[100]; }s[100]; //按照結構體中字符串str的字典順序排序 
int cmp ( const void *a , const void *b ) { return strcmp( (*(In *)a)->str , (*(In *)b)->str ); } qsort(s,100,sizeof(In),cmp); 

1.七、計算幾何中求凸包的cmp

int cmp(const void *a,const void *b) //重點cmp函數,把除了1點外的全部點,旋轉角度排序 
{ struct point *c=(point *)a; struct point *d=(point *)b; if( calc(*c,*d,p[1]) < 0) 
    return 1; else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //若是在一條直線上,則把遠的放在前面   return 1; else
    return -1; }

二、拓展知識點

one、爲啥子使用qsort函數要指定排序元素的大小?

ans:這是個腦殘的問題,給個腦殘的答案吧。由於qsort須要根據元素的大小來進行排序。

two、 所使用的比較函式接受的是 const void* 類型?

ans:由於考慮到qsort的通用性,這樣能夠對數組,結構體數組等類型進行排序了。

2、sort()函數

函數名 功能描述
sort 對給定區間全部元素進行排序
stable_sort 對給定區間全部元素進行穩定排序
partial_sort 對給定區間全部元素部分排序
partial_sort_copy 對給定區間複製並排序
nth_element 找出給定區間的某個位置對應的元素
is_sorted 判斷一個區間是否已經排好序
partition 使得符合某個條件的元素放在前面
stable_partition 相對穩定的使得符合某個條件的元素放在前面

要使用上述函數必須加上頭文件algorithm。

一、sort(begin,end)

小例子

#include<algorithm>

int _tmain(int argc, _TCHAR* argv[]) { int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; } 

輸出結果是把數組a按升序排序,也就是sort函數的排序默認是升序的。

如何使用sort函數降序排序,ok!就像qsort中同樣,咱們須要自定義一個比較函數cmp(返回值爲bool類型)。

二、重載的sort函數-帶比較函數的sort(begin,end,cmp)

定義比較函數的方法

2.一、經常使用方法

下面的比較函數能夠實現降序排序:

bool cmp(int a,int b) { return a>b; }

2.二、使用枚舉類型enum來定義升序或者降序排序。

//ASC升序,DESC降序
enum Cmp{ASC,DESC};

2.3 定義一個比較類,來描述排序的順序。

class compare { private: Cmp comp; public: compare(Cmp c):comp(c) {}; bool operator () (int num1,int num2) { switch(comp) { case ASC: return num1<num2; case DESC: return num1>num2; } } };

測試一下:

int main() { int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,compare(DESC)); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }

瞭解一下便可,由於比較麻煩,根據實際狀況使用。

2.四、使用functional頭文件中的比較對象。

functional提供了一堆基於模板的比較函數對象。equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。對於這些比較對象,咱們能夠望文生義就知道它們的意思了。

for example:

sort(begin,end,less<data-type>();//升序
 sort(begin,end,greater<data-type>();//降序

接着上面的例子,使用一下比較對象

int _tmain(int argc, _TCHAR* argv[]) { int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,greater<int>()); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }

 

3、qsort函數和sort函數的PK。

一、cmp函數不一樣

返回值類型不一樣,qsort函數的cmp返回值類型爲int,sort函數的cmp返回值爲bool。

參數不一樣,sort函數的cmp能夠直接是參與比較的引用類型,而qsort是嚴格的空指針類型。

比較表達式不一樣,qsort中的cmp使用的是「-」號,而sort中的cmp使用的是「>」。

二、性能的區別

sort函數是c++中標準模板庫的的函數,在qsort()上已經進行了優化,根據狀況的不一樣能夠採用不一樣的算法,因此較快。在一樣的元素較多和一樣的比較條件下,sort()的執行速度都比qsort()要快。另外,sort()是類屬函數,能夠用於比較任何容器,任何元素,任何條件。

相關文章
相關標籤/搜索