日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qsort()与sort的用法(收藏)

發布時間:2024/4/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qsort()与sort的用法(收藏) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

sort()函數是C++中的排序函數其頭文件為:#include<algorithm>頭文件;

qsort()是C中的排序函數,其頭文件為:#include<stdlib.h>

? ?qsort()----六類qsort排序方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

qsort函數很好用,但有時不太會用比如按結構體一級排序、二級排序、字符串排序等。

函數原型:

void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void*,const void *))

輸入參數:

Base待排序的數組

nelem數組元數的個數(長度)

width每一個元素所占存儲空間的大小

fcmp用于對數組元素進行比較的函數的指針(該函數是要自己寫的),返回值為1或-1(p1>p2則返回-1,p1<p2則返回1,p1==p2則返回0),size_t是int

輸出參數:base?以升序排列

以下是其具體分類及用法(若無具體說明是以降序排列):

? (1)對一維數組排序: ??

(Element_type?是一位數組中存放的數據類型,可以是char,int,float,double,ect)

int comp(const void *p1,const void *p2)

{

return *((Element_type*)p2)>*((Element_type*)p1)?1:-1;

}

int main()

{

Element_type list[MAX];

initial(list);//這是對數組list[max]初始化

qsort(list, sizeof(list),sizeof(Element_type),Comp);//調用函數qsort

return 0;

}

? (2)對字符串排序: ??

int Comp(const void *p1,const void *p2)

{

return strcmp((char *)p2,(char *)p1);

}

int main()

{

char a[MAX1][MAX2];

initial(a);

qsort(a,lenth,sizeof(a[0]),Comp);

//lenth?為數組a的長度

}

? (3)按結構體中某個關鍵字排序(對結構體一級排序): ??

typedef struct Node

{

double data;

int other;

}Node;

int Comp(const void *p1,const void *p2)

{

return (*(Node *)p2).data > (*(Node *)p1).data ? 1 : -1;

}

qsort(s,100,sizeof(s[0]),Comp);

? (4)按結構體中多個關鍵字排序(對結構體多級排序)[以二級為例]: ??

struct Node

{

int x;

int y;

}s[100];

//按照x從小到大排序,當x相等時按y從大到小排序(這是3跟4的區別)

int Comp(const void *p1,const void *p2)

{

struct Node *c=(Node *)p1;

struct Node *d=(Node *)p2;

if(c->x!=d->x)

return c->x-d->x;

else

return d->y - c->y;

}

? (5)對結構體中字符串進行排序: ??

struct Node

{

int data;

char str[100];

}s[100];

//按照結構體中字符串str?的字典序排序

int Comp(const void *p1,const void *p2)

{

return strcmp((*(Node *)p1).str,(*(Node *)p2).str);

}

qsort(s,100,sizeof(s[0],Comp);

? (6)計算幾何中求凸包的Comp ??

int Comp(const void *p1,const void *p2)//重點Comp函數,把除了1點外的所有的點旋轉角度排序

{

struct point *c=(point *)p1;

struct point *d=(point *)p2;

if( cacl(*c, *d,p[1])<0)

return 1;

elseif(!cacl(*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;

}?

? ?sort()函數用法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

sort?對給定區間所有元素進行排序

stable_sort?對給定區間所有元素進行穩定排序

partial_sort?對給定區間所有元素部分排序

partial_sort_copy?對給定區間復制并排序

nth_element?找出給定區間的某個位置對應的元素

is_sorted?判斷一個區間是否已經排好序

partition?使得符合某個條件的元素放在前面

stable_partition?相對穩定的使得符合某個條件的元素放在前面

語法描述為:

(1)sort(begin,end),表示一個范圍,例如:

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按升序排序,說到這里可能就有人會問怎么樣用它降序排列呢?這就是下一個討論的內容。

? ?(2)sort(begin,end,compare) ??

一種是自己編寫一個比較函數來實現,接著調用三個參數的sort:sort(begin,end,compare)就成了。對于list容器,這個方法也適用,把compare作為sort的參數就可以了,即:sort(compare)。

1)自己編寫compare函數:

bool compare(int a,int b)

{

return a<b; //升序排列,如果改為return a>b,則為降序

}

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

for(i=0;i<20;i++)

cout<<a[i]<<endl;

return 0;

}

2)更進一步,讓這種操作更加能適應變化。也就是說,能給比較函數一個參數,用來指示是按升序還是按降序排,這回輪到函數對象出場了。

為了描述方便,我先定義一個枚舉類型EnumComp用來表示升序和降序。很簡單:

enum Enumcomp{ASC,DESC};

然后開始用一個類來描述這個函數對象。它會根據它的參數來決定是采用“<”還是“>”。

class compare

{

private:

Enumcomp comp;

public:

compare(Enumcomp c):comp(c) {};

bool operator () (int num1,int num2)

{

switch(comp)

{

case ASC:

return num1<num2;

caseDESC:

return num1>num2;

}

}

};

?

接下來使用sort(begin,end,compare(ASC))實現升序,sort(begin,end,compare(DESC))實現降序。

主函數為:

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;

}

3)其實對于這么簡單的任務(類型支持“<”、“>”等比較運算符),完全沒必要自己寫一個類出來。標準庫里已經有現成的了,就在functional里,include進來就行了。functional提供了一堆基于模板的比較函數對象。它們是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。對于這個問題來說,greater和less就足夠了,直接拿過來用:

?

升序: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;

}

?4)既然有迭代器,如果是string?就可以使用反向迭代器來完成逆序排列,程序如下:

int main()

{

string str("cvicses");

string s(str.rbegin(),str.rend());

cout << s <<endl;

return 0;

}

?

?

?

?

轉自百度文庫,覺得很實用,所以自己留個備份:http://wenku.baidu.com/view/667c03c10c22590102029d7a.html

總結

以上是生活随笔為你收集整理的qsort()与sort的用法(收藏)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。