C++筆記 劃分與排序演算法
primer C++筆記
劃分與排序演算法
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <array>
#include <vector>
#include <forward_list>
#include <iterator>
#include <random>
using namespace std;
//劃分演算法
namespace Partition
{
//is_partitioned(beg, end, unaryPred)
void test01()
{
std::array<int, 9> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto is_even = [](int i) { return i % 2 == 0; };
std::cout.setf(std::ios_base::boolalpha);
std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
std::partition(v.begin(), v.end(), is_even);
std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
std::reverse(v.begin(), v.end());
std::cout << std::is_partitioned(v.begin(), v.end(), is_even);
//false true false
}
//partition_copy(beg, end, dest1, dest2, unaryPred)
void test02()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int true_arr[5] = { 0 };
int false_arr[5] = { 0 };
std::partition_copy(std::begin(arr), std::end(arr), std::begin(true_arr), std::begin(false_arr),
[](int i) {return i > 5; });
std::cout << "true_arr: ";
for (auto x : true_arr) {
std::cout << x << ' ';
}
std::cout << '\n';
std::cout << "false_arr: ";
for (auto x : false_arr) {
std::cout << x << ' ';
}
std::cout << '\n';
/*true_arr: 6 7 8 9 10
false_arr : 1 2 3 4 5*/
}
//partition_point(beg, end, unaryPred)
void test03()
{
std::array<int, 9> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto is_even = [](int i) { return i % 2 == 0; };
std::partition(v.begin(), v.end(), is_even);
auto p = std::partition_point(v.begin(), v.end(), is_even);
std::cout << "Before partition:\n ";
std::copy(v.begin(), p, std::ostream_iterator<int>(std::cout, " "));
std::cout << "\nAfter partition:\n ";
std::copy(p, v.end(), std::ostream_iterator<int>(std::cout, " "));
/*Before partition :
8 2 6 4
After partition :
5 3 7 1 9*/
}
//stable_partition(beg, end, unaryPred)
//partition(beg, end, unaryPred)
void test04()
{
std::vector<int> v{ 0, 0, 3, 0, 2, 4, 5, 0, 7 };
std::stable_partition(v.begin(), v.end(), [](int n) {return n > 0; });
for (int n : v) {
std::cout << n << ' ';
}
std::cout << '\n';
//3 2 4 5 7 0 0 0 0
}
template <class ForwardIt>
void quicksort(ForwardIt first, ForwardIt last)
{
if (first == last) return;
auto pivot = *std::next(first, std::distance(first, last) / 2);
ForwardIt middle1 = std::partition(first, last,
[pivot](const auto& em) { return em < pivot; });
ForwardIt middle2 = std::partition(middle1, last,
[pivot](const auto& em) { return !(pivot < em); });
quicksort(first, middle1);
quicksort(middle2, last);
}
void test05()
{
std::vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
std::cout << "Original vector:\n ";
for (int elem : v)
std::cout << elem << ' ';
auto it = std::partition(v.begin(), v.end(), [](int i) {return i % 2 == 0; });
std::cout << "\nPartitioned vector:\n ";
std::copy(std::begin(v), it, std::ostream_iterator<int>(std::cout, " "));
std::cout << " * ";
std::copy(it, std::end(v), std::ostream_iterator<int>(std::cout, " "));
std::forward_list<int> fl = { 1, 30, -4, 3, 5, -4, 1, 6, -8, 2, -5, 64, 1, 92 };
std::cout << "\nUnsorted list:\n ";
for (int n : fl)
std::cout << n << ' ';
std::cout << '\n';
quicksort(std::begin(fl), std::end(fl));
std::cout << "Sorted using quicksort:\n ";
for (int fi : fl) std::cout << fi << ' ';
std::cout << '\n';
/*Original vector :
0 1 2 3 4 5 6 7 8 9
Partitioned vector :
0 8 2 6 4 * 5 3 7 1 9
Unsorted list :
1 30 - 4 3 5 - 4 1 6 - 8 2 - 5 64 1 92
Sorted using quicksort :
-8 - 5 - 4 - 4 1 1 1 2 3 5 6 30 64 92*/
}
}
//排序演算法
namespace Sort
{
/*sort(beg, end);
stable_sort(beg, end);
sort(beg, end, comp);
stable_sort(beg, end, comp);*/
void test01()
{
std::array<int, 10> s = { 5, 7, 4, 2, 8, 6, 1, 9, 0, 3 };
// 用預設的 operator< 排序
std::sort(s.begin(), s.end());
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';
// 用標準庫比較函式物件排序
std::sort(s.begin(), s.end(), std::greater<int>());
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';
// 用自定義函式物件排序
struct {
bool operator()(int a, int b) const
{
return a < b;
}
} customLess;
std::sort(s.begin(), s.end(), customLess);
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';
// 用 lambda 表示式排序
std::sort(s.begin(), s.end(), [](int a, int b) {
return b < a;
});
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';
/*0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0*/
}
/*is_sorted(beg, end);
is_sorted(beg, end, comp);
is_sorted_until(beg, end);
is_sorted_until(beg, end, comp);*/
void test02()
{
int digits[] = { 3, 1, 4, 1, 5 };
for (auto i : digits) std::cout << i << ' ';
std::cout << ": is_sorted: " << std::boolalpha
<< std::is_sorted(std::begin(digits), std::end(digits)) << '\n';
std::sort(std::begin(digits), std::end(digits));
for (auto i : digits) std::cout << i << ' ';
std::cout << ": is_sorted: "
<< std::is_sorted(std::begin(digits), std::end(digits)) << '\n';
/*3 1 4 1 5 : is_sorted: false
1 1 3 4 5 : is_sorted : true*/
}
void test03()
{
std::random_device rd;
std::mt19937 g(rd());
const int N = 6;
int nums[N] = { 3, 1, 4, 1, 5, 9 };
const int min_sorted_size = 4;
int sorted_size = 0;
do {
std::shuffle(nums, nums + N, g);
int *sorted_end = std::is_sorted_until(nums, nums + N);
sorted_size = std::distance(nums, sorted_end);
for (auto i : nums) std::cout << i << ' ';
std::cout << " : " << sorted_size << " initial sorted elements\n";
} while (sorted_size < min_sorted_size);
/*4 1 9 5 1 3 : 1 initial sorted elements
4 5 9 3 1 1 : 3 initial sorted elements
9 3 1 4 5 1 : 1 initial sorted elements
1 3 5 4 1 9 : 3 initial sorted elements
5 9 1 1 3 4 : 2 initial sorted elements
4 9 1 5 1 3 : 2 initial sorted elements
1 1 4 9 5 3 : 4 initial sorted elements*/
}
//partial_sort(beg, mid, end);
//partial_sort(beg, mid, end, comp);
void test04()
{
std::array<int, 10> s{ 5, 7, 4, 2, 8, 6, 1, 9, 0, 3 };
std::partial_sort(s.begin(), s.begin() + 3, s.end());
for (int a : s) {
std::cout << a << " ";
}
}
//partial_sort_copy(beg, end, destBeg, destEnd);
//partial_sort_copy(beg, end, destBeg, destEnd, comp);
void test05()
{
std::vector<int> v0{ 4, 2, 5, 1, 3 };
std::vector<int> v1{ 10, 11, 12 };
std::vector<int> v2{ 10, 11, 12, 13, 14, 15, 16 };
std::vector<int>::iterator it;
it = std::partial_sort_copy(v0.begin(), v0.end(), v1.begin(), v1.end());
std::cout << "Writing to the smaller vector in ascending order gives: ";
for (int a : v1) {
std::cout << a << " ";
}
std::cout << '\n';
if (it == v1.end())
std::cout << "The return value is the end iterator\n";
it = std::partial_sort_copy(v0.begin(), v0.end(), v2.begin(), v2.end(),
std::greater<int>());
std::cout << "Writing to the larger vector in descending order gives: ";
for (int a : v2) {
std::cout << a << " ";
}
std::cout << '\n' << "The return value is the iterator to " << *it << '\n';
/*Writing to the smaller vector in ascending order gives : 1 2 3
The return value is the end iterator
Writing to the larger vector in descending order gives : 5 4 3 2 1 15 16
The return value is the iterator to 15*/
}
//nth_element(beg, nth, end);
//nth_element(beg, nth, comp);
void test06()
{
std::vector<int> v{ 5, 6, 4, 3, 2, 6, 7, 9, 3 };
std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end());
std::cout << "The median is " << v[v.size() / 2] << '\n';
std::nth_element(v.begin(), v.begin() + 1, v.end(), std::greater<int>());
std::cout << "The second largest element is " << v[1] << '\n';
/*The median is 5
The second largest element is 7*/
}
}
相關文章
- 《演算法筆記一》複雜度、排序、二分、異或演算法筆記複雜度排序
- 【Java筆記】十分鐘搞定常用的八種排序演算法與程式碼實現Java筆記排序演算法
- 【演算法】演算法圖解筆記_快速排序演算法圖解筆記排序
- 分數規劃學習筆記筆記
- C++筆記— 排序函式sort() 和vector容器C++筆記排序函式
- C++ 學習筆記(2):String、遞迴、排序C++筆記遞迴排序
- 《演算法筆記》5. 字首樹、桶排序、排序演算法總結演算法筆記排序
- Javascript常見排序演算法的筆記JavaScript排序演算法筆記
- 雙層桶劃分學習筆記筆記
- 《演算法筆記》4. 堆與堆排序、比較器詳解演算法筆記排序
- 演算法與資料結構——選擇排序(c++)演算法資料結構排序C++
- 排序演算法之「快速排序(Quick Sort) _c++ 」排序演算法UIC++
- 演算法筆記之動態規劃(4)演算法筆記動態規劃
- 資料結構與演算法讀書筆記 - 004 -C++遞迴資料結構演算法筆記C++遞迴
- 《資料結構與演算法分析》學習筆記-第七章-排序資料結構演算法筆記排序
- 「分數規劃」學習筆記及做題記錄筆記
- C++筆記——C++基本思想與實現(一)C++筆記
- 快速排序演算法C++實現排序演算法C++
- C++排序演算法之氣泡排序改進版C++排序演算法
- C++筆記C++筆記
- 筆記:拓撲排序筆記排序
- 氣泡排序筆記排序筆記
- 排序演算法:二分插入排序排序演算法
- 排序演算法速記排序演算法
- 排序演算法之——二分插入排序演算法排序演算法
- 演算法學習筆記1語法 (C++組)演算法筆記C++
- [演算法學習筆記] 差分約束演算法筆記
- 希爾排序使用直接插入排序、二分插入排序的C++程式碼實現演算法排序C++演算法
- C++ 學習筆記(1):STL、Vector 與 SetC++筆記
- C++ Primer筆記C++筆記
- Effective C++筆記C++筆記
- c++筆記_引用C++筆記
- 【Java資料結構與演算法筆記(一)】常見排序演算法及面試考點總結Java資料結構演算法筆記排序面試
- 【筆記/模板】拓撲排序筆記排序
- 《演算法筆記》3. 歸併排序、隨機快排整理演算法筆記排序隨機
- 演算法學習筆記(21):數論分塊演算法筆記
- 讀天才與演算法:人腦與AI的數學思維筆記09_分形演算法AI筆記
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序