sort 函式與qsort 函式及其用法

2021-08-31 17:54:47 字數 4026 閱讀 6052

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 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合...