【问题标题】:Trouble with quicksort快速排序的问题
【发布时间】:2018-01-31 06:56:06
【问题描述】:

我在快速排序方面遇到了一点问题。我所做的算法执行并在最后打印数字。但是没有订购。看看能不能找出什么破绽?你能帮帮我吗?

#include <stdio.h>
#include <stdlib.h>

int partition (int numbers[], int arrayStart, int arrayEnd) {

    int pivot = numbers[arrayEnd];
    int partitionIndex = arrayStart;

    for (int i = arrayStart; i < arrayEnd; i++) {

        if (numbers[i] <= pivot) {
           int temp = numbers[partitionIndex];
           numbers[partitionIndex] = numbers[i];
           numbers[i] = temp;
           partitionIndex = partitionIndex + 1;
       }

       int temp2 = numbers[partitionIndex];
       numbers[partitionIndex] = numbers[arrayEnd];
       numbers[arrayEnd] = temp2;

       return partitionIndex;
   }
}


void QuickSort (int numbers[], int arrayStart, int arrayEnd) {

    if (arrayStart < arrayEnd) {
        int partitionIndex = partition (numbers, arrayStart, arrayEnd);
        QuickSort(numbers, arrayStart, partitionIndex - 1);
        QuickSort(numbers, partitionIndex + 1, arrayEnd);
   }
   else {
       return;
   }
}

int main() {

   int numbers[6] = {2, 5, 1, 6, 3, 4};

   int arrayStart = 0;
   int arrayEnd = 5;

   QuickSort(numbers, arrayStart, arrayEnd);

   for (int i = 0; i < 6; i++) {
       printf("%d ", numbers[i]);
   }

}

【问题讨论】:

  • 考虑使用调试器
  • 使用你的调试器。分区后检查阵列。它看起来确实是分区的吗?
  • 顺便考虑用指针+长度来表示数组的一个切片。指针+startIndex+endIndex 工作量太大。
  • partition 函数中的return 是在循环内部还是外部?外部似乎更合理。您的编译器可能会抱怨您并不总是从函数返回值。注意你的编译器;它比你更了解 C。 (如果它没有抱怨,请调高警告级别,或获得更好的编译器。)

标签: c algorithm sorting quicksort


【解决方案1】:

问题在于您的分区函数。您在 for 循环中返回 partitionIndex

修正逻辑

int partition (int numbers[], int arrayStart, int arrayEnd)
{
    int pivot = numbers[arrayEnd];
    int partitionIndex = arrayStart;

    for (int i = arrayStart; i < arrayEnd; i++)
    {

        if (numbers[i] <= pivot)
        {
            int temp = numbers[partitionIndex];
            numbers[partitionIndex] = numbers[i];
            numbers[i] = temp;
            partitionIndex = partitionIndex + 1;
        }

    }
    int temp2 = numbers[partitionIndex];
    numbers[partitionIndex] = numbers[arrayEnd];
    numbers[arrayEnd] = temp2;
    return partitionIndex;
}

完整代码

#include <stdio.h>
#include <stdlib.h>

int partition (int numbers[], int arrayStart, int arrayEnd)
{
    int pivot = numbers[arrayEnd];
    int partitionIndex = arrayStart;

    for (int i = arrayStart; i < arrayEnd; i++)
    {

        if (numbers[i] <= pivot)
        {
            int temp = numbers[partitionIndex];
            numbers[partitionIndex] = numbers[i];
            numbers[i] = temp;
            partitionIndex = partitionIndex + 1;
        }

    }
    int temp2 = numbers[partitionIndex];
    numbers[partitionIndex] = numbers[arrayEnd];
    numbers[arrayEnd] = temp2;
    return partitionIndex;
}


void QuickSort (int numbers[], int arrayStart, int arrayEnd)
{

    if (arrayStart < arrayEnd)
        {
        int partitionIndex = partition (numbers, arrayStart, arrayEnd);
        QuickSort(numbers, arrayStart, partitionIndex - 1);
        QuickSort(numbers, partitionIndex + 1, arrayEnd);
        }
     else
       {
        return;
       }
}

int main() {

    int numbers[6] = {2, 5, 1, 6, 3, 4};

    int arrayStart = 0;
    int arrayEnd = 5;

    QuickSort(numbers, arrayStart, arrayEnd);

    for (int i = 0; i < 6; i++) {
        printf("%d ", numbers[i]);
    }

}

输出

1 2 3 4 5 6 Program ended with exit code: 0

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2020-06-18
    • 2018-05-27
    • 2016-10-02
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2018-09-20
    相关资源
    最近更新 更多