partial_sort(beg,mid,end)
partial_sort(beg,mid,end,comp)
對mid-beg個元素進行排序,也就是說,如果migd-beg等於42,則該函數將有序次序中的最小值元素放在序列中
的前42個位置。partial_sort完成之後,從beg到mid(但不包括mid)範圍內的元素時有序的,已排序範圍內沒有
元素大於mid之後的元素。未排序元素之間的次序是未指定的。
例如:
有一個賽跑成績的集合,我們想知道前三名的成績但並不關心其他名次的次序,可以這樣對這個序列進行排序。
partial_sort(scores.begin(),scores.begin()+3,scores.end());
那麼paitical_sort的原理是什麼呢?是堆排序!
首先建立一個堆,得到最大值。如果要得到次大值,就將頭結點去掉,即調用pop_heap(),此時的頭結點就是
次大值,可以這樣依次得到最大或者最小的幾個值!
#include <vector>#include <iterator>#include <iostream>#include <algorithm>#include <functional>#include <cstdlib>#include <time.h>using namespace std;int rand_int(){return rand()%100;}void print(vector<int> &v,const char* s){cout<<s<<endl;copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));cout<<endl;}bool cmp(int &a, int &b){if(a>b)return true;return false;}class compare{public: bool operator()(const int &a,const int &b) { if(a<b) return true; return false; }};int main(){srand(time(NULL));vector<int> v;generate_n(back_inserter(v),10,rand_int);print(v,"產生10個隨機數");partial_sort(v.begin(),v.begin()+4,v.end());print(v,"局部遞增排序");partial_sort(v.begin(),v.begin()+4,v.end(),cmp);print(v,"局部遞減排序");partial_sort(v.begin(),v.begin()+4,v.end(),compare());print(v,"局部遞增排序");return 0;}
通過程式可以看到兩次局部遞增排序並不相同,因為partial_port不是穩定排序演算法。在只需要最大或最小的幾個值時,partial_port比其他排序演算法快。
partial_sort
接受三個參數,分別是區間的頭,中間和結尾。執行後,將前面M(M=中間-頭)個元素有序地放在前面,後面的元素肯定是比前面的大,但他
們內部的次序沒有保證。有序序列不包括中間參數。
nth_element
這個函數只真正排序出一個元素來,就是第n個。函數有三個迭代器的輸入(當然還可以加上一個謂詞),執行完畢後,中間位置指向的元素保證和完全排序後
這個位置的元素一致,前面區間的元素都小於(精確地說,是不大於)後面區間的元素。
所以要得到最大或者最小的20個元素,調用稍有不同。
partial_sort(v.begin(),v.begin()+20,v.end());
nth_element(v.begin(),v.begin()+19,v.end());
其他排序請參看http://blog.csdn.net/xiaoniba10631/article/details/6727045