快速排序数组随机数生成器没有任何打印错误

时间:2017-07-06 21:31:11

标签: c arrays sorting quicksort

我有这个C代码创建一个包含100个随机数的数组,我想使用快速排序对其进行排序,但它总是会出现Segmentation fault错误。

以下是代码:

#define MAX 100
int a[MAX];
void quick_sort(double *x, int l, int r) {       
    int l1, r1;

    if (l < r) {       
        l1 = l;
        r1 = r;

        do {       
            while (l1 < r && x[l1 - 1] <= x[l - 1]) {       
                l1++;
            }
            while (l < r1 && x[r1 - 1] >= x[l - 1]) {       
                r1--;
            }
            if (l1 < r1) {       
                swap(&x[l1 - l], &x[r1 - 1]);
            }
        } while (l1 < r1);

        swap(&x[l - 1], &x[r1 - 1]);
        quick_sort(x, l, r1 - 1);
        quick_sort(x, r1 + 1, r);
    }
}

void printArray(int a[], int size) {
    int i;
    for (i = 0; i < size; i++)
        printf("%d ", a[i]);
    printf("\n");
}

int main() {
    int i = 1;
    int a_size = sizeof(a) / sizeof(a[0]);
    srand((unsigned int)time(NULL));
    for (i = 0; i < MAX; i++) {
        a[i] = rand() % 501;
    }
    quick_sort(a, 0, a_size);
    printArray(a, a_size);
}

错误是我运行程序时没有打印。 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您的代码中存在许多问题:

  • 您不包括<stdio.h><stdlib.h>,也不包括<time.h>
  • 您的quick_sort函数需要一个指向double数组的指针,但您传递的数组为int
  • 功能swap()的代码未发布。
  • 您在函数quick_sort中实现快速排序算法存在缺陷:

    • 您不应扫描大小为1的切片,请使用(r - l > 1)
    • 您不能将x[l - 1]用作枢轴,它甚至不是要排序的切片的一部分。此外,您应该在交换阶段之前从阵列中提取枢轴,因为它可能会移动。
    • 您不应该将变量命名为l,它看起来太靠近1而您确实在这里犯了错误:swap(&x[l1 - l], &x[r1 - 1]);
    • 您应该初始化l1r1,这样您就不需要在很多地方减去1,这会导致混乱和错误的代码。
    • 研究Wikipedia article中的算法并将其翻译为C.

以下是更正后的版本:

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

#define MAX 100

void swap(int *a, int *b) {
    int x = *a;
    *a = *b;
    *b = x;
}

// Quick Sort using Hoare's original partition scheme
void quick_sort(int *x, int l, int r) {
    if (l < r) {
        int pivot = x[l];
        int l1 = l - 1;
        int r1 = r;

        for (;;) {
            while (x[++l1] < pivot)
                continue;

            while (x[--r1] > pivot)
                continue;

            if (l1 < r1) {
                swap(&x[l1], &x[r1]);
            } else {
                break;
            }
        }
        quick_sort(x, l, r1 + 1);
        quick_sort(x, r1 + 1, r);
    }
}

void printArray(int a[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int main(void) {
    int a[MAX];
    int a_size = sizeof(a) / sizeof(a[0]);

    srand((unsigned int)time(NULL));

    for (int i = 0; i < MAX; i++) {
        a[i] = rand() % 501;
    }
    quick_sort(a, 0, a_size);

    printArray(a, a_size);
    return 0;
}