三方快速排序需要更高的性能
Need higher performance for three-way quick sort
我目前正在尝试实现一个三分区快速排序。下面的代码运行良好,但运行时间不够。我对数据结构、算法和"深度"编程都是新手,所以我试图在更短的时间内摆弄它,但基本上没有成功。(内存性能良好。)
我的直觉是改变支点,但我担心这不会是一个三方快速排序。
#include <iostream>
#include <vector>
#include <cstdlib>
using std::vector;
using std::swap;
int partition3(vector<int> &a, int l, int r) {
int x = a[l];
int j = l;
int k = r;
int i = l+1;
while (i <= k) {
if (a[i] < x) {
swap(a[i],a[j]);
j++;
i++;
}
else if(a[i] > x) {
swap(a[i],a[k]);
k--;
}
else {
i++;
}
}
return j;
}
void randomized_quick_sort(vector<int> &a, int l, int r) {
if (l >= r) {
return;
}
int k = l + rand() % (r - l + 1);
swap(a[l], a[k]);
while (l < r) {
int m = partition3(a, l, r);
if ((m-l) < (r-m)) {
randomized_quick_sort(a, l, m - 1);
l = m + 1;
}
else {
randomized_quick_sort(a, m + 1, r);
r = m - 1;
}
}
}
int main() {
int n;
std::cin >> n;
vector<int> a(n);
for (size_t i = 0; i < a.size(); ++i) {
std::cin >> a[i];
}
randomized_quick_sort(a, 0, a.size() - 1);
for (size_t i = 0; i < a.size(); ++i) {
std::cout << a[i] << ' ';
}
}
排序在现实世界中是一个相当复杂的问题。试着看看一些高效的实现,例如那些由C++标准库的实现提供的实现。浏览网页,阅读文章,查看讨论。。。
只是一些注意事项:
- 随机数生成是(相对)昂贵的,它可以显著降低快速排序的速度。(然而,对于某些类型的数据,它也可以起到相反的作用。)
- 整数除法(相对而言)非常昂贵,可能比随机数生成更昂贵
- 在实践中很少单独使用纯快速排序。通常,它与插入排序相结合,因为递归调用对于非常小的分区效率很低(阈值通常设置在8到16个元素之间)
- 为了防止最坏情况下的快速排序复杂性,通常会检查递归级别,如果它超过某个阈值(2 x log_2(n)),则用另一种算法(通常为堆排序)对其余数据进行排序
等等。。。
更新
还有两个想法:
- 在多核/多核环境中,并行算法可能会为您提供最佳的加速。但是,设计一个并行的快速排序绝非易事。大部分复杂性都落在高效的并行分区和负载平衡上。Libstdc++并行模式有一个很好的OpenMP实现。或者,您也可以查看我的AQsort:https://github.com/DanielLangr/AQsort.
- 要提高快速排序的效率,请使用尾部调用消除/优化。它大大减少了所需的调用堆栈空间
我在这里看到了非常扎实的代码。
如果你想保留算法,最好的加速方法是将其从递归改为迭代。这不会是一个巨大的推动,但会有所帮助,每个功能调用都是一个很好避免的开销。手动交换也是一个不错的选择。
您还可以获得一定的速度来避免额外的内存分配,所以您应该尽可能多地重用变量,例如,在while中声明int m。
相关文章:
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 不正确的比较和交换计数器输出用于快速排序功能
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 使用快速排序对 C++ 中的可视化工具错误进行排序
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 并行快速排序分区中的隔离错误
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 快速排序不适用于大型数组
- 快速排序;分段错误,但找不到位置?
- 快速排序函数在快速排序算法中如何工作?
- 3路随机快速排序分区功能
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- 我想要一个改变数组快速排序的2个数字的函数
- C++一个具有 2 个参数(___ _____,整数长度)的函数中的快速排序
- 三方快速排序需要更高的性能