我正在为整数编写快速排序算法,但在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!

10-08 06:00