我需要在C中实现快速排序(按降序排列),但我遇到了一些麻烦 - 尤其是逻辑问题。我试图修改一些旧的代码,这些代码来自于C ++中提升的快速排序实现。代码似乎总是完全返回输入,所以逻辑错误在哪里?
{{1}}
答案 0 :(得分:0)
您的代码中存在多个问题:
partition
函数应该迭代,直到leftPointer
变得大于rightPointer
。while
循环应该跳过更大的元素,而不是更小的元素。right
元素应移至partition
函数的末尾。partition
假设数据透视位于right
索引,因此最好不要将数据透视值作为参数传递。Quicksort()
不应返回值。Array
应在main
中本地定义,并作为参数传递给函数。这是一个更正版本,可选择在命令行上接受参数值:
#include <stdio.h>
#include <stdlib.h>
void swap(int Array[], int one, int two) {
int temp = Array[one];
Array[one] = Array[two];
Array[two] = temp;
}
int partition(int Array[], int left, int right) {
int pivot = Array[right];
int leftPointer = left - 1;
int rightPointer = right;
for (;;) {
while (Array[++leftPointer] > pivot) {
}
while (rightPointer > 0 && Array[--rightPointer] < pivot) {
}
if (leftPointer >= rightPointer) {
break;
} else {
swap(Array, leftPointer, rightPointer);
}
}
/* move pivot to partition point */
swap(Array, leftPointer, right);
return leftPointer;
}
void Quicksort(int Array[], int left, int right) {
if (left < right) {
int PartitionPoint = partition(Array, left, right);
Quicksort(Array, left, PartitionPoint - 1);
Quicksort(Array, PartitionPoint + 1, right);
}
}
#define MAX_SIZE 100
int main(int argc, char **argv) {
int i, n;
int Array[MAX_SIZE];
if (argc > 1) {
for (n = 0; n < MAX_SIZE && n < argc - 1; n++) {
Array[n] = strtol(argv[n + 1], NULL, 0);
}
} else {
printf("Give values: ");
for (n = 0; n < MAX_SIZE; n++) {
if (scanf("%d", &Array[n]) != 1)
break;
}
}
Quicksort(Array, 0, n - 1);
printf("\nOutput: ");
for (i = 0; i < n; i++) {
printf("%d ", Array[i]);
}
printf("\n");
return 0;
}