如何解决我试图实现 QuickSort 但将垃圾数组元素作为输出
这是我用于快速排序的分区逻辑,它向我提供垃圾数组元素值作为错误。我想我弄错了分区代码,但我也不确定。
#include <bits/stdc++.h>
using namespace std;
void swap(int* x,int* y)
{
int temp = *y;
*y = *x;
*x = temp;
}
int partition(int* A,int left,int right)
{
int pivot = A[left];
int i = left + 1,j = right;
while (i <= j) {
if (A[i] <= pivot)
++i;
if (A[j] > pivot)
--j;
if (A[i] > pivot && A[j] <= pivot) {
swap(&A[i],&A[j]);
++i;
--j;
}
}
swap(&A[left],&A[j]);
return j;
}
void quickSort(int* A,int right)
{
if (left >= right)
return;
int pi = partition(A,left,right);
quickSort(A,pi - 1);
quickSort(A,pi + 1,right);
}
int main()
{
int A[] = { 5,8,1,31,2,44,6,4 };
int n = sizeof(A) / sizeof(A[0]);
quickSort(A,n - 1);
for (auto i : A)
cout << i << " ";
return 0;
}
解决方法
在您的 while 循环中,您使用了 3 个单独的 if
语句。在检查 i <= j
之前,所有 3 项都可能在每次迭代中执行。在对 partition
的第二次调用中,这会导致 j
被设置为 -1
,从这一点开始,您的代码写入了大量超出数组边界的值,导致堆栈损坏和崩溃或至少是一个错误的结果。
添加 else
可以解决问题:
while (i <= j) {
if (A[i] <= pivot)
++i;
else if (A[j] > pivot)
--j;
else if (A[i] > pivot && A[j] <= pivot) {
swap(&A[i],&A[j]);
++i;
--j;
}
}
请注意,当数组已经排序时,choosing the first element as the pivot 会导致快速排序的最差情况性能,通常中点是更好的选择。
与您的问题无关,但另请参阅:
Why should I not #include <bits/stdc++.h>?
Why is "using namespace std;" considered bad practice?
具有与标准库(swap
)中的函数同名的函数,结合通过bits/stdc++.h
导入整个标准库并通过将整个标准库引入全局命名空间using namespace std
可能会导致模棱两可的过载错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。