qsort 與sort的用法(收藏)

2021-09-22 19:18:50 字數 4690 閱讀 8582

sort()函式是c++中的排序函式其標頭檔案為:#include標頭檔案;

qsort()是c中的排序函式,其標頭檔案為:#include

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輸出引數: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)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* ar**)

int a[20]=,i;

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

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

cout輸出結果將是把陣列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 ab,則為降序

int _tmain(int argc, _tchar* ar**)

int a[20]=,i;

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

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

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

為了描述方便,我先定義乙個列舉型別enumcomp用來表示公升序和降序。很簡單:

enum enumcomp;

然後開始用乙個類來描述這個函式物件。它會根據它的引數來決定是採用「<」還是「>」。

class compare

private:

enumcomp comp;

public:

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

bool operator () (int num1,int num2)

switch(comp)

case asc:

return num1casedesc:

return num1>num2;

接下來使用sort(begin,end,compare(asc))實現公升序,sort(begin,end,compare(desc))實現降序。

主函式為:

int main()

int a[20]=,i;

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

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

cout3)其實對於這麼簡單的任務(型別支援「<」、「>」等比較運算子),完全沒必要自己寫乙個類出來。標準庫里已經有現成的了,就在functional裡,include進來就行了。functional提供了一堆基於模板的比較函式物件。它們是(看名字就知道意思了):equal_to、not_equal_to、greater、greater_equal、less、less_equal。對於這個問題來說,greater和less就足夠了,直接拿過來用:

公升序:sort(begin,end,less());

降序:sort(begin,end,greater()).

int _tmain(int argc, _tchar* ar**)

int a[20]=,i;

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

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

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

int main()

string str("cvicses");

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

cout << s

sort和qsort的用法

好吧,承認知識匱乏,一直都是手打快排的,才知道有這個函式 必須要科普一下。msdn中的定義 template voidsort ranit first,ranit last 1 template voidsort ranit first,ranit last,pred pr 2 標頭檔案 inclu...

sort 函式與qsort 函式及其用法

sort 函式是c 中的排序函式其標頭檔案為 include標頭檔案 qsort 是c中的排序函式,其標頭檔案為 include 1 qsort 六類qsort排序方法 qsort函式很好用,但有時不太會用比如按結構體一級排序 二級排序 字串排序等。函式原型 void qsort void base...

sort和qsort函式的用法

stl裡有個sort函式,可以直接對陣列排序,複雜度為n log2 n 使用這個函式,需要包含標頭檔案 include 這個函式可以傳兩個引數或三個引數。第乙個引數是要排序的 區間首位址 第二個引數是區間 尾位址的下一位址 也就是說,排序的區間是 a,b 簡單來說,有乙個陣列int a 100 要對...