C/c++ STL排序函數 sort用法 以及 和qsort的用法與區別

1.默認的sort函數是按升序排。

sort(a,a+n); //兩個參數分別爲待排序數組的首地址和尾地址


2.可以自己寫一個cmp函數,按特定意圖進行排序。

sort(a,a+n,cmp);


例如:
int cmp( const int &a, const int &b ){
if( a > b )
return 1;
else
return 0;
}
sort(a,a+n,cmp);

是對數組a降序排序


又如:
int cmp( const POINT &a, const POINT &b ){
if( a.x < b.x )
return 1;
else
if( a.x == b.x ){
if( a.y < b.y )
return 1;
else
return 0;
}
else
return 0;
}
sort(a,a+n,cmp);

是先按x升序排序,若x值相等則按y升序排


(C++)STL排序函數sort和qsort的用法與區別

主要內容:

1、qsort的用法

2、sort的用法

3、qsort和sort的區別

qsort的用法:

原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

功 能: 使用快速排序例程進行排序

參 數:

1 待排序數組首地址

2 數組中待排序元素數量

3 各元素的佔用空間大小

4 指向函數的指針,用於確定排序的順序

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

qsort要求提供的函數是需要自己定義的一個比較函數,比較函數使得qsort通用性更好。有了比較函數qsort可以實現對數組、字符串、結構體等結構進行升序或降序排序。
如int cmp(const void *a, const void *b)中有兩個元素作爲參數(參數的格式不能變的。)返回一個int值,如果比較函數返回大於0,qsort就認爲a > b,返回小於0,qsort就認爲a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比較函數返回本來應該是1的(即a > b),而卻返回-1(小於0的數),那麼qsort認爲a < b,就把b放在前面去,但實際上是a > b的,所以就造成了降序排序的差別了。簡單來說,比較函數的作用就是給qsort指明元素的大小事怎麼比較的。

qsort中幾種常見的cmp函數:

一、對int類型數組排序 
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp); 

二、對char類型數組排序(同int類型) 
char word[100];
int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
}

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

三、對double類型數組排序(特別要注意) 
double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
//返回值的問題,顯然cmp返回的是一個整型,所以避免double返回小數而被丟失。
qsort(in,100,sizeof(in[0]),cmp); 

四、對結構體一級排序 
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(s[0]),cmp); 

五、對結構體二級排序 

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(s[0]),cmp); 

sort的用法:

MSDN中的定義:

template<class RanIt>
void sort(RanIt first, RanIt last); //--> 1)
template<class RanIt, class Pred>
void sort(RanIt first, RanIt last, Pred pr); //--> 2)

頭文件:
#include <algorithm>
using namespace std;

說明:sort有默認的比較函數,默認是按升序排列。

void sort(RanIt first, RanIt last, Pred pr);前兩個參數爲迭代器指針,分別指向容器的首尾,第三個參數爲比較方法。

比較方法有三種:

1、默認(不寫):對於內置類型,按照升序排列;

2、標準庫自帶函數:functional提供了一堆基於模板的比較函數對象:equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。升序:sort(begin,end,less<data-type>()); 降序:sort(begin,end,greater<data-type>()).

3、自定義函數:如

int cmp(const int &a,const int &b)

{

  return a>b

}

Sort中的cmp函數參數可以直接是參與比較的引用類型。

qsort與sort的區別:

std::sort是一個改進版的qsort.

std::sort函數優於qsort的一些特點:對大數組採取9項取樣,更完全的三路劃分算法,更細緻的對不同數組大小採用不同方法排序。

1.cmp函數和qsort中cmp函數的不同

​int cmp(const int &a,const int &b)

{

  return a>b

}

Sort中的cmp函數參數可以直接是參與比較的引用類型,sort可以採用標準庫自帶的比較函數,而qsort沒有。

2.cmp函數比較時qsort用“-”,而sort用”>”.這也是一個重要的區別。

3.sort函數是c++中標準模板庫的的函數,在qsort()上已經進行了優化,根據情況的不同可以採用不同的算法,所以較快。在同樣的元素較多和同樣的比較條件下,sort()的執行速度都比qsort()要快。另外,sort()是類屬函數,可以用於比較任何容器,任何元素,任何條件。使用時需調用<algorithm>
sort(begin(),end(),cmp)。

 

參考文章:

http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/22/2513776.html

http://www.cnblogs.com/zhangshu/archive/2011/05/20/2052359.html

http://blog.csdn.net/zzzmmmkkk/article/details/4266888/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章