sort和qsort函式的用法

2021-07-04 01:18:55 字數 3663 閱讀 6450

做acm

題的時候,排序是一種經常要用到的操作。如果每次都自己寫個冒泡之類的o(n^2)排序,不但程式容易超時,而且浪費寶貴的比賽時間,還很有可能寫錯。stl裡面有個sort函式,可以直接對陣列排序,複雜度為n*log2(n)。使用這個函式,需要包含標頭檔案 #include

這個函式可以傳兩個引數或三個引數。第乙個引數是要排序的

區間首位址

,第二個引數是區間

尾位址的下一位址

。也就是說,

排序的區間是[a,b)

。簡單來說,有乙個陣列int a[100],要對從a[0]到a[99]的元素進行排序,只要寫sort(a,a+100)就行了,預設的排序方式是公升序

。拿我出的「ac的策略」這題來說,需要對陣列t的第0到len-1的元素排序,就寫sort(t,t+len);

對向量v排序也差不多,sort(v.begin(),v.end());

排序的資料型別不侷限於整數,只要是定義了小於運算的型別都可以,比如字串類string。

如果是沒有定義小於運算的資料型別,或者想改變排序的順序,就要用到第三引數——比較函式。比較函式是乙個自己定義的函式,返回值是bool型,它規定了什麼樣的關係才是「小於」。想把剛才的整數陣列按降序排列,可以先定義乙個比較函式cmp

bool cmp(int a,int b)

排序的時候就寫sort(a,a+100,cmp);

假設自己定義了乙個結構體node

struct node

有乙個node型別的陣列node arr[100],想對它進行排序:先按a值公升序排列,如果a值相同,再按b值降序排列,如果b還相同,就按c降序排列。就可以寫這樣乙個比較函式:

以下是**片段:

bool cmp(node x,node y)

排序時寫sort(arr, arr+100, cmp);

***************====qsort用法********************=

語法:#include void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );

功能:對buf 指向的資料(包含num 項,每項的大小為size)進行快速排序。如果函式compare 的第乙個引數小於第二個引數,返回負值;如果等於返回零值;如果大於返回正值。函式對buf 指向的資料按公升序排序。

**********==

上面說的很抽象,其實概括起來就是,比較函式的引數相減順序如果一樣就是公升序(從小到大),如果相反就是降序(從大到小)。例如下面的cmp()就是公升序,但如果函式體改寫成return *(int *)b-*(int *)a;就是降序了,很簡單吧!

qsort(s[0],n,sizeof(s[0]),cmp);

int cmp(const void *a, const void *b)

一、對int型別陣列排序

int num[100];

sample:

int cmp ( const void *a , const void *b )

qsort(num,100,sizeof(num[0]),cmp);

二、對char型別陣列排序(同int型別)

char word[100];

sample:

int cmp( const void *a , const void *b )

qsort(word,100,sizeof(word[0]),cmp);

三、對double型別陣列排序(特別要注意)

double in[100];

int cmp( const void *a , const void *b )  

qsort(in,100,sizeof(in[0]),cmp)

四、對結構體一級排序

struct in

s[100]

//

按照data的值從小到大將結構體排序,關於結構體內的排序關鍵資料data的型別可以很多種,參考上面的例子寫

int cmp( const void *a ,const void *b)

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

五、對結構體

struct in

s[100];

//

按照x從小到大排序,當x相等時按照y從大到小排序

int cmp( const void *a , const void *b )

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

六、對字串進行排序

struct in

s[100];

//

按照結構體中字串str的字典順序排序

int cmp ( const void *a , const void *b )

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

七、計算幾何中求凸包的cmp

intcmp(const void *a,const void *b) //

重點cmp函式,把除了1點外的所有點,旋轉角度排序

sort和qsort函式的用法

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

qsort和sort函式用法區別

區別 sort是qsort的公升級版,如果能用sort盡量用sort,使用也比較簡單,不像qsort還得自己去寫 cmp 函式,只要註明 使用的庫函式就可以使用,引數只有兩個 如果是普通用法 頭指標和尾指標 預設sort排序後是公升序,如果想讓他降序排列,可以使用自己編的cmp函式 bool com...

sort和qsort的用法

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