1. 程式人生 > >STL之partial_sort排序學習

STL之partial_sort排序學習

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(),此時的頭結點就是
次大值,可以這樣依次得到最大或者最小的幾個值!
  1. #include 
    <vector>
  2. #include <iterator>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <functional>
  6. #include <cstdlib>
  7. #include <time.h>
  8. using namespace std;  
  9. int rand_int()  
  10. {  
  11.     return rand()%100;  
  12. }  
  13. void print(vector<int> &v,const char* s)  
  14. {  
  15.     cout<
    <s<<endl;  
  16.     copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));  
  17.     cout<<endl;  
  18. }  
  19. bool cmp(int &a, int &b)  
  20. {  
  21.     if(a>b)  
  22.         return true;  
  23.     return false;  
  24. }  
  25. class compare{  
  26. public:  
  27.     bool operator()(const int &a,const int &b)  
  28.     {  
  29.         if(a<b)  
  30.             return true;  
  31.         return false;  
  32.     }  
  33. };  
  34. int main()  
  35. {  
  36.     srand(time(NULL));  
  37.     vector<int> v;  
  38.     generate_n(back_inserter(v),10,rand_int);  
  39.     print(v,"產生10個隨機數");  
  40.     partial_sort(v.begin(),v.begin()+4,v.end());  
  41.     print(v,"區域性遞增排序");  
  42.     partial_sort(v.begin(),v.begin()+4,v.end(),cmp);  
  43.     print(v,"區域性遞減排序");  
  44.     partial_sort(v.begin(),v.begin()+4,v.end(),compare());  
  45.     print(v,"區域性遞增排序");  
  46.     return 0;  
  47. }  


通過程式可以看到兩次區域性遞增排序並不相同,因為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

相關推薦

STLpartial_sort排序學習

partial_sort(beg,mid,end) partial_sort(beg,mid,end,comp) 對mid-beg個元素進行排序,也就是說,如果migd-beg等於42,則該函式將有序次序中的最小值元素放在序列中 的前42個位置。partial_sort完成之後,從beg到mid(但不包括m

STLvector,deque學習實例

iostream lis urn time pla pub cout size for 1 ``` 2 #include<iostream> 3 #include<algorithm> 4 #include<ctime>

資料結構與演算法美專欄學習筆記-排序(上)

排序方法 氣泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。   複雜度歸類 氣泡排序、插入排序、選擇排序 O(n^2) 快速排序、歸併排序 O(nlogn) 計數排序、基數排序、桶排序 O(n)     演算法的執行效率 1. 最

STL劃分與排序演算法(Partions and Sorting)

目錄           STL之劃分與排序演算法(Partions and Sorting) 劃分演算法 一、is_partitoned 二、partition 三、partition_copy(beg,

資料結構與演算法美專欄學習筆記-排序(下)

分治思想 分治思想 分治,顧明思意就是分而治之,將一個大問題分解成小的子問題來解決,小的子問題解決了,大問題也就解決了。 分治與遞迴的區別 分治演算法一般都用遞迴來實現的。分治是一種解決問題的處理思想,遞迴是一種程式設計技巧。   歸併排序 演算法原理 歸併的思想 先把陣列從中間分

C++STLVector向量詳解,用法和例子 一起學習 一起加油

                                            &

資料結構與演算法美專欄學習筆記-線性排序

線性排序 線性排序的概念 線性排序演算法包括桶排序、計數排序、基數排序。 線性排序演算法的時間複雜度為O(n)。 線性排序的特點 此3種排序演算法都不涉及元素之間的比較操作,是非基於比較的排序演算法。 對排序資料的要求很苛刻,重點掌握此3種排序演算法的適用場景。   桶排序 演算法

數據結構與算法美專欄學習筆記-排序優化

str 原則 選擇排序 .com 實現一個函數 一個數 原因 通用 並排 選擇合適的排序算法 回顧 選擇排序算法的原則 1)線性排序時間復雜度很低但使用場景特殊,如果要寫一個通用排序函數,不能選擇線性排序。 2)為了兼顧任意規模數據的排序,一般會首選時間復雜度為O(nl

資料結構與演算法美專欄學習筆記-排序優化

選擇合適的排序演算法 回顧   選擇排序演算法的原則 1)線性排序時間複雜度很低但使用場景特殊,如果要寫一個通用排序函式,不能選擇線性排序。 2)為了兼顧任意規模資料的排序,一般會首選時間複雜度為O(nlogn)的排序演算法來實現排序函式。 3)同為O(nlogn)的快排和歸併排序相比,

算法學習——遞歸快速排序

算法思路 () 留下 結果 思路 while 兩個 amp 算法學習 算法描述 快速排序 算法思路 快速排序算法的基本思路為從數組中選擇一個數為基準數,之後,將比基準數小的數放在左邊,比基準數大的數放在右邊(分為了兩個區),之後將左邊(小於基準數)與右邊(大於基準數)

STL排序演算法

1.merge() 以下是排序和通用演算法:提供元素排序策略 merge: 合併兩個有序序列,存放到另一個序列。 例如: vecIntA,vecIntB,vecIntC是用vector宣告的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素

java學習 陣列排序-選擇排序

package Day004; public class arrayDemo { public static void main(String [] args) { System.out.println("跟陣列有關的demo"); int [] arrs =

演算法學習選擇排序演算法的python實現

  ——參考自《演算法圖解》 1 def findSmallest(arr): 2 # 假設第一個元素最小 3 smallest = arr[0] 4 smallest_index = 0 5 for i in range(1,len(arr)): 6

C++ STLdeque對結構體的增加,刪除,排序的操作

****************deque的用法******************************** c.assign(beg,end)            將[beg; end)區間中的資料賦值給c。 c.assign(n,elem)         

STL partial_sort排序演算法

通過示例很容易理解什麼是部分排序。假設有一個容器,它儲存了 100 萬個數值,但我們只對其中最小的 100 個感興趣。可以對容器的全部內容排序,然後選擇前 100 個元素,但這可能有點消耗時間。這時候需要使用部分排序,只需要這些數中的前100個是有序放置的。 對於部分排序,有一個特殊的演算法

STL原始碼剖析》學習迭代器

一、迭代器作用        在設計模式中有一種模式叫迭代器模式,簡單來說就是提供一種方法,在不需要暴露某個容器的內部表現形式情況下,使之能依次訪問該容器中的各個元素,這種設計思維在STL中得到了廣泛的應用,是STL的關鍵所在,通過迭代器,容器和演算法可以有機的粘合在一

演算法導論學習插入排序

《演算法導論》買了好久了,基本上沒怎麼看,最近思想上有了轉變,覺得學習才是王道。準備重新拾起來學習,下面我就《演算法導論》中的排序演算法中的 插入排序做了個c++的簡單實現,附加解釋一下自己對下面的這段程式碼的理解。 #include "iostream" using n

Java再學習-演算法氣泡排序

           Java排序,據說有八大排序,小編這次系列部落格可能講不了全部,我將自己理解比較到位的幾個排序,和大家分享一下吧。今天來說一說氣泡排序,其實氣泡排序屬於交換排序的一種,氣泡排序

資料結構與演算法三 深入學習排序

視訊課堂https://edu.csdn.net/course/play/7621 在本章中,你將學習: 通過使用快速排序來排序資料 通過使用歸併排序來排序資料 快速排序演算法

第二天學習筆記簡單排序(氣泡排序、選擇排序、插入排序)

public class demo { public static void main(String[] args) { //陣列長度 方便整合測試 int length = 10000; //生成隨機數long測試 邊界1--1000