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 好吧,承認知識匱乏,一直都是手打快排的,才知道有這個函式 必須要科普一下。msdn中的定義 template voidsort ranit first,ranit last 1 template voidsort ranit first,ranit last,pred pr 2 標頭檔案 inclu... sort 函式是c 中的排序函式其標頭檔案為 include標頭檔案 qsort 是c中的排序函式,其標頭檔案為 include 1 qsort 六類qsort排序方法 qsort函式很好用,但有時不太會用比如按結構體一級排序 二級排序 字串排序等。函式原型 void qsort void base... stl裡有個sort函式,可以直接對陣列排序,複雜度為n log2 n 使用這個函式,需要包含標頭檔案 include 這個函式可以傳兩個引數或三個引數。第乙個引數是要排序的 區間首位址 第二個引數是區間 尾位址的下一位址 也就是說,排序的區間是 a,b 簡單來說,有乙個陣列int a 100 要對...sort和qsort的用法
sort 函式與qsort 函式及其用法
sort和qsort函式的用法