我有这个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);
}
错误是我运行程序时没有打印。 有人可以帮我解决这个问题吗?
答案 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]);
l1
和r1
,这样您就不需要在很多地方减去1
,这会导致混乱和错误的代码。以下是更正后的版本:
#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;
}