1.sort函數
#include <algorithm>
預設從小到大,如果降序可寫第三方函數進行排序, sort(array,array+n,cmp)
1.普通排序,升序
06 | int a[10]={7,3,4,6,5,1,2,9,8,0}; |
08 | for ( int i=0;i<10;i++) |
12 | OUTPUT:0 1 2 3 4 5 6 7 8 9 |
普通排序,降序
04 | bool cmp( int a, int b) |
10 | int a[10]={7,3,4,6,5,1,2,9,8,0}; |
12 | for ( int i=0;i<10;i++) |
16 | OUTPUT:9 8 7 6 5 4 3 2 1 0 |
2.結構體排序,a升,b降,c降
10 | bool cmp(data x,data y) |
12 | if (x.a!=y.a) return x.a<x.y; |
13 | if (x.b!=y.b) return x.b>y.b; |
14 | if (x.c!=y.c) return x.c>y.c; |
19 | sort(array,array+n,cmp); |
2.qsort函數:
原 型:
voidqsort(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指明元素的大小事怎麼比較的。
3.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 - *(int *)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;
}
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);
六、對字元串進行排序
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(s[0]),cmp);
七、計算幾何中求凸包的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;
}
4.sort和qsoort比較:
1.cmp函數和qsort中cmp函數的不同
<span style="font-family:Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace;">sort的</span><span style="font-size: 1em; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">cmp函數返</span><span style="font-size: 1em; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">回值類型為bool 傳回隻能是1或0.當然也可以為int類型,但值也是限定為0或1,不然會出現排序錯誤。qsort的cmp函數傳回值為int,可以為正數或負數。</span>
Sort中的cmp函數參數可以直接是參與比較的引用類型。
2.cmp函數比較時qsort用“-”,而sort用”>”.這也是一個重要的差別。
3.sort函數是c++中标準模闆庫的的函數,在qsort()上已經進行了優化,根據情況的不同可以采用不同的算法,是以較快。在同樣的元素較多和同樣的比較條件下,sort()的執行速度都比qsort()要快。另外,sort()是類屬函數,可以用于比較任何容器,任何元素,任何條件。使用時需調用<algorithm>
sort(begin(),end(),cmp),