sort()函式是c++中的排序函式其標頭檔案為:#include標頭檔案;
qsort()是c中的排序函式,其標頭檔案為:#include
1、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)
int main()
(2)對字串排序:
int comp(const void *p1,const void *p2)
int main()
(3)按結構體中某個關鍵字排序(對結構體一級排序):
struct node
s[100];
int comp(const void *p1,const void *p2)
qsort(s,100,sizeof(s[0]),comp);
(4)按結構體中多個關鍵字排序(對結構體多級排序)[以二級為例]:
struct node
s[100];
//按照x從小到大排序,當x相等時按y從大到小排序(這是3跟4的區別)
int comp(const void *p1,const void *p2)
(5)對結構體中字串進行排序:
struct node
s[100];
//按照結構體中字串 str 的字典序排序
int comp(const void *p1,const void *p2)
qsort(s,100,sizeof(s[0],comp);
(6)計算幾何中求凸包的comp
int comp(const void *p1,const void *p2)//重點comp函式,把除了1點外的所有的點旋轉角度排序
2、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)
,i;for(i=0;i<20;i++)
cout<
sort(a,a+20);
for(i=0;i<20;i++)
cout<
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)
int _tmain(int argc, _tchar* argv)
,i;for(i=0;i<20;i++)
cout<
sort(a,a+20,compare);
for(i=0;i<20;i++)
cout<
return 0; }
2)更進一步,讓這種操作更加能適應變化。也就是說,能給比較函式乙個引數,用來指示是按公升序還是按降序排,這回輪到函式物件出場了。
為了描述方便,我先定義乙個列舉型別enumcomp用來表示公升序和降序。很簡單:
enum enumcomp;
然後開始用乙個類來描述這個函式物件。它會根據它的引數來決定是採用「<」還是「>」。
class compare ;
bool operator () (int num1,int num2)
} };
接下來使用 sort(begin,end,compare(asc))實現公升序,sort(begin,end,compare(desc))實現降序。
主函式為:
int main()
,i;for(i=0;i<20;i++)
cout<
sort(a,a+20,compare(desc));
for(i=0;i<20;i++)
cout<
return 0; }
3)其實對於這麼簡單的任務(型別支援「<」、「>」等比較運算子),完全沒必要自己寫乙個類出來。標準庫里已經有現成的了,就在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* argv)
,i;for(i=0;i<20;i++)
cout<
sort(a,a+20,greater());
for(i=0;i<20;i++)
cout<
return 0; }
4)既然有迭代器,如果是string 就可以使用反向迭代器來完成逆序排列,程式如下:
int main()
#include
#include
#include
#include
using namespace std;
int stick[100], n;
bool used[100];
//unused:沒有使用的棍子的數目
//left:剩下的長度
//len:當前認為的計算的長度
bool dfs(int unused, int left, int len)
} //經過一輪搜尋仍得不到正確答案,則返回false
return false; }
int main()
//先進行從大到小排序
sort(stick, stick+n, greater());
//根據題目條件,從小向大尋找
for (i=stick[0]; i<=sum; ++i)
} }
} return 0; }
qsort函式 sort函式
先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的的qsort函式,使用...
qsort函式 sort函式
先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的的qsort函式,使用...
qsort函式 sort函式
qsort函式 sort函式 精心整理篇 先說明一下qsort和sort,只能對連續記憶體的資料進行排序,像鍊錶這樣的結構是無法排序的。首先說一下,qsort qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合...