1. 程式人生 > >C++ 排序函式 sort()

C++ 排序函式 sort()

想起來自己天天排序排序,冒泡啊,二分查詢啊,結果在STL中就自帶了排序函式sort

所以自己總結了一下,首先看sort函式見下表:

函式名功能描述
sort對給定區間所有元素進行排序
stable_sort對給定區間所有元素進行穩定排序
partial_sort對給定區間所有元素部分排序
partial_sort_copy對給定區間複製並排序
nth_element找出給定區間的某個位置對應的元素
is_sorted判斷一個區間是否已經排好序
partition使得符合某個條件的元素放在前面
stable_partition相對穩定的使得符合某個條件的元素放在前面

要使用此函式只需用#include <algorithm> sort即可使用,語法描述為:

sort(begin,end),表示一個範圍,例如:

int _tmain(int argc, _TCHAR* argv[])
{
 int a[20]={2,4,1,23,5,76,0,43,24,65},i;
 for(i=0;i<20;i++)
  cout<<a[i]<<endl;
 sort(a,a+20);
 for(i=0;i<20;i++)
 cout<<a[i]<<endl;
 return 0;
}

輸出結果將是把陣列a按升序排序,說到這裡可能就有人會問怎麼樣用它降序排列呢?這就是下一個討論的內容.

一種是自己編寫一個比較函式來實現,接著呼叫三個引數的sort:sort(begin,end,compare)

就成了。對於list容器,這個方法也適用,把compare作為sort的引數就可以了,即:sort(compare).

1)自己編寫compare函式:

bool compare(int a,int b)
{
      return a<b;   //升序排列,如果改為return a>b,則為降序

}

int _tmain(int argc, _TCHAR* argv[])
{
     int a[20]={2,4,1,23,5,76,0,43,24,65},i;
     for(i=0;i<20;i++)
       cout<<a[i]<<endl;
     sort(a,a+20,compare);
     for(i=0;i<20;i++)
       cout<<a[i]<<endl;
     return 0;
}

3)其實對於這麼簡單的任務(型別支援“<”、“>”等比較運算子),完全沒必要自己寫一個類出來。標準庫裡已經有現成的了,就在functional裡,include進來就行了。functional提供了一堆基於模板的比較函式物件。它們是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。對於這個問題來說,greater和less就足夠了,直接拿過來用:

  • 升序:sort(begin,end,less<data-type>());
  • 降序:sort(begin,end,greater<data-type>()).

int _tmain(int argc, _TCHAR* argv[])
{
      int a[20]={2,4,1,23,5,76,0,43,24,65},i;
      for(i=0;i<20;i++)
          cout<<a[i]<<endl;
      sort(a,a+20,greater<int>());
      for(i=0;i<20;i++)
          cout<<a[i]<<endl;
      return 0;
}