快速排序调试
quicksort debug
有人能指出为什么快速排序的实现不起作用吗?我已经看了好几次了,似乎找不到错误
int quickPartition ( int data[], int p, int r)
{
int x=data[r];
int i=p-1;
for (int j=p; j<r; j++)
{
if(data[j]<x)
{
i++;
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
int temp=data[i+1];
data[i+1]=data[r];
data[r]=temp;
}
i++;
cout<<"i:"<<i<<endl;
return i;
}
void myQuickSort(int data[], int left, int right)
{
if(left<right)
{
int q=quickPartition(data,left,right);
myQuickSort(data,left,q-1);
myQuickSort(data,q+1,right);
}
}
对快速排序的调用只是
myQuickSort(anArray,0,size-1);
Methinks
int temp=data[i+1];
data[i+1]=data[r];
data[r]=temp;
应该在for
循环之外。
分区的实现看起来完全是假的。你想要的是从两端迭代,在每一端找到一个属于相反部分的对象。如果迭代器相遇,就完成了。否则,交换两个对象并找到下一对。
就我个人而言,我无法正确地思考您正在使用的抽象:我可以更容易地思考迭代器指向相应的对象,并找到下一个要交换的对象也应该是函数。此外,我需要把事情分解成小的、可理解的部分。您可以在某个时刻交换对象。这应该是一个单独的功能。这个partition()看起来像这样:
int* partition(int* left, int* right, int value) {
while (left != right)
{
left = find_forward(left, right, value);
right = find_backward(left, right, value);
if (left != right)
{
swap(left, right);
}
}
return left;
}
我还没有对此进行测试,但类似的东西应该会起作用。显然,我只会使用std::swap()
来交换元素,使用std::find_if()
来找到合适的位置(对于使用std::reverse_iterator
的向后情况)。好吧,如果这不是家庭作业,你无论如何都会使用std::sort()
:它不使用普通的快速排序,而是一种变体,它可以检测到它遇到了坏情况,并在这种情况下使用std::heap_sort()
来保证它保持O(n log n)。
相关文章:
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 不正确的比较和交换计数器输出用于快速排序功能
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 使用快速排序对 C++ 中的可视化工具错误进行排序
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 并行快速排序分区中的隔离错误
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 快速排序不适用于大型数组
- 快速排序;分段错误,但找不到位置?
- 快速排序函数在快速排序算法中如何工作?
- 3路随机快速排序分区功能
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- 我想要一个改变数组快速排序的2个数字的函数
- 快速排序调试
- 索引数组快速排序调试