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 #include #include #include #include #include #include using namespace std;
int rand_int()
void print(vector&v,const char* s)
class compare
通過程式可以看到兩次區域性遞增排序並不相同,因為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());
其他排序請參看
從partial sort挖掘堆排序
用過多次stl中的partial sort演算法,卻全然不知其實現原理,也沒跟進stl原始碼中去深究。某天在 面試的時候被問到它的實現原理,沒能答出來,實在慚愧。閱讀partial sort源 以後,有種似曾相識的感覺,哦 原來是堆排序。以前只在書本上了解過堆排序,沒去認真了解和實現過,著實不知道它...
c STK庫partial sort函式分析
partial sort函式模型 partial sort first,middle,end 從first到end進行排序,前first到middle前不變,從middle到end倒序排列 預設的謂語為less 從小到大 從first到middle的前乙個元素先排序,排序後的序列記作l1 l1.le...
STL之演算法
演算法是指解決問題的方 而完整的描述,對於規範的輸入,在有限時間內要獲得所需要的輸出。不同的演算法可能使用不同的時間 空間或效率完成同樣的任務。想要評估乙個演算法的好壞,目前可以通過時間複雜度和空間複雜度來進行衡量。時間複雜度,是指演算法執行指令所需的計算量。演算法的執行時間和其所要處理的資料之間存...