在C中实现降序Quicksort

时间:2017-10-24 21:30:22

标签: c quicksort

我需要在C中实现快速排序(按降序排列),但我遇到了一些麻烦 - 尤其是逻辑问题。我试图修改一些旧的代码,这些代码来自于C ++中提升的快速排序实现。代码似乎总是完全返回输入,所以逻辑错误在哪里?

{{1}}

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;
}