c_cpp 归并排序的非递归实现,慢于标准库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 归并排序的非递归实现,慢于标准库相关的知识,希望对你有一定的参考价值。
#include <numeric>
#include <chrono>
#include <vector>
#include <random>
#include <iostream>
#include <algorithm>
using namespace std;
void merge(vector<int> &a, size_t l, size_t m, size_t u, vector<int> &aux) {
auto p1 = l, p2 = m, pos = l;
while (p1 != m && p2 != u)
aux[pos++] = a[p2] < a[p1] ? a[p2++] : a[p1++];
while (p1 != m) aux[pos++] = a[p1++];
while (p2 != u) aux[pos++] = a[p2++];
for (auto i = l; i < u; ++i) a[i] = aux[i];
}
void merge_sort(vector<int> &a) {
auto n = a.size();
auto aux = a;
for (auto k = 1u; k < n; k <<= 1)
for (auto u = 0u; u <= n;) {
auto m = u + k;
if (m >= n) break;
u = min(m + k, n);
merge(a, m - k, m, u, aux);
}
}
int main() {
vector<int> a(100'000);
iota(a.begin(), a.end(), 0);
random_device rd;
mt19937 gen(rd());
shuffle(a.begin(), a.end(), gen);
auto t1 = chrono::system_clock::now();
merge_sort(a);
//stable_sort(a.begin(), a.end());
auto t2 = chrono::system_clock::now();
cout << (is_sorted(a.begin(), a.end()) ? "" : "Not ") << "Sorted" << endl;
cout << "Time used: " << chrono::duration<double>(t2 - t1).count() << "s" << endl;
return 0;
}
以上是关于c_cpp 归并排序的非递归实现,慢于标准库的主要内容,如果未能解决你的问题,请参考以下文章
Java 归并排序的非递归实现
[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(下)-- 非递归方法实现
高速排序 归并排序的非递归版本号 备忘
书上讲解归并排序的非递归写法
归并排序 的非递归算法
c_cpp 树的前序,中序和后序的非递归实现