我正在为整数编写快速排序算法,但在srand函数中遇到一个奇怪的segfault错误。这是来自sort.h的代码:
int distributePivot (int *a, int left, int pivot, int right) {
int i, j;
if (pivot != right)
swapInt(&pivot, &right);
i = left;
j = right - 1;
while (i < j) {
while (i < j && a[i] <= a[right])
i++;
while (j > i && a[j] >= a[right])
j--;
if (i < j)
swapInt(&a[i], &a[j]);
}
if (i < right)
swapInt(&a[i], &a[right]);
return i;
}
void intArrayQuickSort (int *a, int left, int right) {
int pivot;
if (left < right) {
pivot = rand() % (right - left +1) + left;
pivot = distributePivot(a, left, pivot, right);
intArrayQuickSort (a, left, pivot -1);
intArrayQuickSort (a, pivot, right);
}
}
这是来自sort-test.c的调用:
srand(time(NULL));
intArrayQuickSort(temp, 0, n - 1);
其中,
temp
是指向整数的指针。这是我在gdb中执行它时遇到的错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff77e9884 in rand () from /lib64/libc.so.6
你能帮我么?
非常感谢你。
编辑:这是swapInt函数:
void swapInt (int *a, int *b) {
int aux = *a;
*a = *b;
*b = aux;
}
最佳答案
程序逻辑中有错误。
例如。
在主要
数组= [1,2]
调用intArrayQuickSort(array,0,1); // a:array,左:0,右:1
在intArrayQuickSort中
ivot = 1 // rand() % (right - left +1) + left;
的临时结果
调用distributionPivot(a,0,1,1)
在distributionPivot中
不交换(枢轴,右),因为枢轴== righit
i = 0 //左
j = 0 //对-1
不执行while块,因为i == j
执行交换(a [i],a [right]),因为i // a = [2,1] // !! NG
返回0
//已经是非法状态
在intArrayQuickSort中
枢轴= 0; //从返回值:0
调用intArrayQuickSort(a,0,-1); // left:0,枢轴-1:-1
无操作退货
调用intArrayQuickSort(a,1,1); // pivot + 1:1,右:1
无操作退货
在主要
结果:a = [2,1] // NG!