做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...