为什么我的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;
}
答案 0 :(得分:2)
好吧,它没有排序,因为它实现不正确。 partition
最终必须将分区元素移动到分区之间的位置。你永远不会那样做。我看到你使用子数组的第一个元素(即A[p]
)作为分区元素。它仍处于第一位。你永远不会把它移到别处。
例如,在第一次调用partition
时,您使用8
作为分区元素。但是你永远不会从8
位置重新定位A[0]
。典型的实现通常会将该元素交换到分区之间的最终位置。
这些小do/while
周期中的条件似乎是按降序排序的。你打算做降序吗?或者您只是混淆了条件?
那些小的do/while
周期似乎容易出现数组边界超限。试想一下如果您的原始数组包含相同的元素会发生什么。