gpt4 book ai didi

c++ - 我如何正确实现快速排序?

转载 作者:行者123 更新时间:2023-11-28 04:19:28 27 4
gpt4 key购买 nike

我正在尝试实现快速排序,并且正在按照书中的步骤进行操作,但我不明白应该如何实现三的中位数。我遵循了书本说明,但我不明白为什么三的中位数实际上有帮助?我实际上从未用它做任何事情。

这是我的实现:

这是我的 Quicksort 实现。

void QuickSort::QuickSortM3(std::vector<int> &data, int left, int right){    
if(left < right){
pivotM3(data, left, right);
int i = partition(data, left, right);

QuickSortM3(data, left, i-1);
QuickSortM3(data, i +1, right);
}

}
void QuickSort::pivotM3(std::vector<int> &data,  int left, int right){
std::swap(data[(left+ right)/2], data[(right -1)]);
if(data[left] < data[right-1]){
std::swap(data[left], data[right-1]);
}
if(data[left] < data[right]){
std::swap(data[left], data[right]);
}
if(data[right -1] < data[right]){
std::swap(data[left], data[right-1]);
}

}
int QuickSort::partition(std::vector<int> &data,  int left, int right){
int i = left - 1, j = right; int v = data[right];

for(;;){

while(data[++i] < v);
while (v < data[--j]){
if( j == left) {
break;
}
}
if(i >= j) break;
std::swap(data[i], data[j]);
}
std::swap(data[i], data[right]);
return i;
}

我的意思是,我不应该在分区中使用中间元素吗?任何帮助都会很棒,谢谢。

最佳答案

使用中位数 3 的 Hoare 分区方案示例:

void QuickSort(int a[], int lo, int hi)
{
if(lo >= hi)
return;
int md = lo+(hi-lo)/2; // median of 3
if(a[lo] > a[hi])
std::swap(a[lo], a[hi]);
if(a[lo] > a[md])
std::swap(a[lo], a[md]);
if(a[md] > a[hi])
std::swap(a[md], a[hi]);
int v = a[md]; // partition
int i = lo - 1;
int j = hi + 1;
while(1)
{
while(a[++i] < v);
while(a[--j] > v);
if(i >= j)
break;
std::swap(a[i], a[j]);
}
QuickSort(a, lo, j);
QuickSort(a, j+1, hi);
}

关于c++ - 我如何正确实现快速排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55798026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com