STL基礎--演算法(排序)
阿新 • • 發佈:2019-01-01
STL排序演算法
- 排序演算法要求隨機訪問迭代器
vector, deque, container array, native array
- 例子
vector<int> vec = {9,1,10,2,45,3,90,4,9,5,8}; sort(vec.begin(), vec.end()); // 預設以 < 排序 // vec: 1 2 3 4 5 8 9 9 10 45 90 bool lsb_less(int x, int y) { return (x%10)<(y%10); } sort(vec.begin(), vec.end(), lsb_less); //自定義比較函式lsb_less() // vec: 10 90 1 2 3 4 45 5 8 9 9
- 部分排序
// 找出分數前五的學生
vector<int> vec = {9,60,70,8,45,87,90,69,69,55,7};
partial_sort(vec.begin(), vec.begin()+5, vec.end(), greater<int>());
// vec: 90 87 70 69 69 8 9 45 60 55 7
partial_sort(vec.begin(), vec.begin()+5, vec.end()); //預設 <
// vec: 7 8 9 45 55 90 60 87 70 69 69
- 前幾個(不要求排序)
vector<int> vec = {9,60,70,8,45,87,90,69,69,55,7};
nth_element(vec.begin(), vec.begin()+5, vec.end(), greater<int>());
// vec: 69 87 70 90 69 60 55 45 9 8 7
- 分成兩部分
// 滿足條件的在前,不滿足的在後 vector<int> vec = {9,60,70,8,45,87,90,69,69,55,7}; bool lessThan10(int i) { return (i<10); } partition(vec.begin(), vec.end(), lessThan10); // vec: 8 7 9 90 69 60 55 45 70 87 69 // 每個部分保持之前的順序 stable_partition(vec.begin(), vec.end(), lessThan10); // vec: 9 8 7 60 70 45 87 90 69 69 55
- 堆排序演算法
// 堆:
// 1. 第一個元素總是最大的
// 2. 插入/刪除時間 O(log(n))
vector<int> vec = {9,1,10,2,45,3,90,4,9,5,8};
make_heap(vec.begin(), vec.end());
// vec: 90 45 10 9 8 3 9 4 2 5 1
// 刪除最大元素:
pop_heap(vec.begin(), vec.end()); // 1. 交換vec[0]和最後一個元素vec[size-1]
// 2. 重新對[vec.begin(), vec.end()-1)進行生成堆
// vec: 45 9 10 4 8 3 9 1 2 5 90
vec.pop_back(); // 刪除最後一個元素
// vec: 45 9 10 4 8 3 9 1 2 5
// 增加一個新元素:
vec.push_back(100);
push_heap(vec.begin(), vec.end()); // vec最後一個元素,重新生成堆
// vec: 100 45 10 4 9 3 9 1 2 5 8
// 堆排序:
vector<int> vec = {9,1,10,2,45,3,90,4,9,5,8};
make_heap(vec.begin(), vec.end());
sort_heap(vec.begin(), vec.end());
// vec: 1 2 3 4 5 8 9 9 10 45 100
// 注: sort_heap只能在堆上使用