微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我试图实现 QuickSort 但将垃圾数组元素作为输出

如何解决我试图实现 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 举报,一经查实,本站将立刻删除。