QuickSort没有排序...... C.

时间:2013-11-04 21:57:39

标签: c quicksort

为什么我的QuickSort无法正常工作?这意味着它不会从数组中挑选出值。这是一个简单的5元素数组的输出:

未排序的数组,然后就可以了:

A[0] = 8
A[1] = 1
A[2] = 45
A[3] = 78
A[4] = 234

但这是一个排序数组,至少根据我的代码:

A[0] = 8
A[1] = 234
A[2] = 45
A[3] = 78
A[4] = 1

和代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <math.h>

void printOutAnArray(int *A, int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        printf("A[%d] = %d\n", i, A[i]);
    }
}

void swap(int *i, int *j)
{
    int t = *i;
    *i = *j;
    *j = t;
}

int partition(int A[], int p, int r)
{
    int x = A[p];
    int i = p;
    int j = r+1;

    while (true)
    {
        do j --; while (A[j] <= x);

        do i ++; while(A[i] >= x);

        if (i < j)
            swap(&A[i], &A[j]);
        else
            return j;
    }
}

void Quicksort(int A[], int p, int r)
{
    if (p < r)
    {
        int q = partition(A,p,r);
        Quicksort(A, p, q-1);
        Quicksort(A, q+1, r);
    }
}

int main(int argc, char **argv)
{

    int A[] = {8, 1, 45, 78, 234};
    int n = 5;

    printOutAnArray(A, n);
    printf("\n");

    Quicksort(A, 0, n-1);

    printOutAnArray(A, n);


    return 0;
}

1 个答案:

答案 0 :(得分:2)

好吧,它没有排序,因为它实现不正确。 partition

的一些明显问题
  • 最终必须将分区元素移动到分区之间的位置。你永远不会那样做。我看到你使用子数组的第一个元素(即A[p])作为分区元素。它仍处于第一位。你永远不会把它移到别处。

    例如,在第一次调用partition时,您使用8作为分区元素。但是你永远不会从8位置重新定位A[0]。典型的实现通常会将该元素交换到分区之间的最终位置。

  • 这些小do/while周期中的条件似乎是按降序排序的。你打算做降序吗?或者您只是混淆了条件?

  • 那些小的do/while周期似乎容易出现数组边界超限。试想一下如果您的原始数组包含相同的元素会发生什么。