在平時刷算法題和oj的時候,排序算法是最經常用到的算法之一;且在各類算法書的目錄中 也通常是將各種排序算法放在最前面來講,可見排序算法的重要性。可能許多人都在算法書中有學過冒泡、快速排序的方法,也都大致了解其原理;實際應用時,冒泡排序是最為簡單的,當然復雜度也是最高的.....(就如高德納所說:"冒泡排序除了它迷人的名字和導致了某些有趣的理論問題這一事實之外,似乎沒有什么值得推薦的");快排在理想情況下可以說是最高效的了(nlogn)。但快速排序並不像冒泡排序那樣好理解和記憶,每次都需要自己回憶並把模板代碼敲上去...想想就是一件挺麻煩的事。不過,還好在C++中有快排函數現成的可以用...想想就是件極好的事。
現在對sort()和qsort()的一些用法做下介紹,但講的都並不完整,只是把比賽時常用的一些內容羅列出來。
sort函數:其實sort()並不能叫做快速排序,而應該說成智能排序;它正常情況下,會使用快排,但是發現快排惡化的話,會自動調整成其他排序來輔助。是最高效的排序。在C++的algorithm庫中。
sort(begin,end); /*在[begin, end]中的元素進行排序按升序排列 sort()默認是按升序排序,如果要按降序排序,還需自己編寫一個比較函數來實現 */
eg. :
int _main() { int a[20],i; for(i=0;i<20;i++) cin>>a[i]; sort(a,a+20); //按升序排序 for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
這里的排序是升序的,那如果要降序的該怎么辦呢?下面給出自己編寫比較函數來實現的代碼:
int cmp(int a,int b) { return a<b; //升序排列;改為return a>b,則為降序 } int main() { int a[20],i; for(i=0;i<20;i++) cin>>a[i]; sort(a,a+20,cmp); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
其實只是為了實現對整型和實型數組的升序、降序排序,可以有更簡單的方法,無需自己再編函數,因為標准庫里有現成的了,它提供了好些基於模板的比較函數對象,可以直接用的了;這里要用到的是greater<data_type>和less<data_type>。
- 升序:sort(begin,end,less<data-type>());
- 降序:sort(begin,end,greater<data-type>());
int main() { int a[20],i; for(i=0;i<20;i++) cin>>a[i]; sort(a,a+20,less<int>());//如果要按降序,就改為greater<int>() for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
下面是qsort():
qsort(quicksort)根據你給的比較函數給一個數組快速排序,是通過指針移動實現排序功能。排序之后的結果仍然放在原來數組中。
qsort和compare的用法如下:
void qsort( void *base, size_len, size_data, int compare); int compare (const void *elem1, const void *elem2 ) ;
compare函數:
1 int compare(const void *a , const void *b ) 2 3 { 4 return *(int *)a - *(int *)b; //升序排序 5 6 //return *(int *)b - *(int *)a; //降序排序 7 8 }
上面是對Int型的排序,如果是字符型,就把int換為char。而double型的為下:
1 int cmp(const void*a,const void*b) 2 { 3 return *(double*)a>*(double*)b?1:-1;//升序 4 5 //return *(double*)b>*(double*)a?1:-1; 降序 6 }