天天看點

sort函數和qsort函數

1.sort函數

#include <algorithm>

預設從小到大,如果降序可寫第三方函數進行排序,      sort(array,array+n,cmp)

1.普通排序,升序

01

#include <iostream>

02

#include <algorithm>

03

using

namespace

std;

04

int

main()

05

{

06

int

a[10]={7,3,4,6,5,1,2,9,8,0};

07

sort(a,a+10);

08

for

(

int

i=0;i<10;i++)

09

cout<<a[i]<<

" "

;

10

return

0;

11

}

12

OUTPUT:0 1 2 3 4 5 6 7 8 9

普通排序,降序

01

#include <iostream>

02

#include <algorithm>

03

using

namespace

std;

04

bool

cmp(

int

a,

int

b)

05

{

06

return

a>b;

07

}

08

int

main()

09

{

10

int

a[10]={7,3,4,6,5,1,2,9,8,0};

11

sort(a,a+10,cmp);

12

for

(

int

i=0;i<10;i++)

13

cout<<a[i]<<

" "

;

14

return

0;

15

}

16

OUTPUT:9 8 7 6 5 4 3 2 1 0

2.結構體排序,a升,b降,c降

01

#include <iostream>

02

#include <algorithm>

03

using

namespace

std;

04

struct

data

05

{

06

int

a;

07

int

b;

08

int

c;

09

};

10

bool

cmp(data x,data y)

11

{

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;

15

}

16

int

main()

17

{

18

.....

19

sort(array,array+n,cmp);

20

return

0;

21

}

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),

繼續閱讀