STL之partial_sort排序學習
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 <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<
- 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
相關推薦
STL之partial_sort排序學習
partial_sort(beg,mid,end) partial_sort(beg,mid,end,comp) 對mid-beg個元素進行排序,也就是說,如果migd-beg等於42,則該函式將有序次序中的最小值元素放在序列中 的前42個位置。partial_sort完成之後,從beg到mid(但不包括m
STL之vector,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,
資料結構與演算法之美專欄學習筆記-排序(下)
分治思想 分治思想 分治,顧明思意就是分而治之,將一個大問題分解成小的子問題來解決,小的子問題解決了,大問題也就解決了。 分治與遞迴的區別 分治演算法一般都用遞迴來實現的。分治是一種解決問題的處理思想,遞迴是一種程式設計技巧。 歸併排序 演算法原理 歸併的思想 先把陣列從中間分
資料結構與演算法之美專欄學習筆記-線性排序
線性排序 線性排序的概念 線性排序演算法包括桶排序、計數排序、基數排序。 線性排序演算法的時間複雜度為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++ STL之deque對結構體的增加,刪除,排序的操作
****************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