Segfault在C中使用quicksort实现

时间:2012-01-07 13:38:20

标签: c quicksort

我正在调试我的代码,用于在C中进行快速排序算法。它在运行时编译但失败并出现“分段错误”。

有人可以帮我调试它并给我代码的工作版本吗?我知道互联网上现有的和有效的。但我真正想要的是找到我自己的代码的错误。

void myQuickSort(int list[],int head, int tail)
{
    int m = head;
    int n = tail;

    int key = list[m];
    ++head;
    while(head < tail)
    {
        while(list[head] < key)
        {
            ++head;
        }
        while(list[tail] >= key)
        {
            --tail;
        }
        //swamp two elements, to divide the array to two groups
        int temp = list[head];
        list[head] = list[tail];
        list[tail] = temp;

    }

    //get the pivot element in dividing position
    int temp = list[m];
    list[m] = list[head];
    list[head] = temp;

    myQuickSort(list, m, head-1);
    myQuickSort(list, head+1, n);
}

3 个答案:

答案 0 :(得分:5)

您的功能永远不会退出。

它会一直调用自己,直到调用堆栈已满并导致堆栈溢出异常。

编译器应该为此生成警告:

warning C4717: 'myQuickSort' : recursive on all control paths, function will cause runtime stack overflow

您需要一个退出条件,类似于:

void myQuickSort(int list[],int head, int tail)
{
    //exit condition, or else the function will always call itself
    if ( head >= tail )
       return;

    /**
    ...
    */

    myQuickSort(list, m, head-1);
    myQuickSort(list, head+1, n);
}

另外,请务必调用以下函数:

int num[5] = {1,4,2,3,5};
myQuickSort(num,0,4);

最终参数必须比数组的长度小1,因为C ++数组是基于0的。

您还需要在while循环中进行一次额外检查:

 while( head < tail && list[head] < key )  // see if head reached the end
 {
     ++head;
 }
 while( head < tail && list[tail] >= key )
 {
     --tail;
 }

或者你可以传递数组的结尾。

答案 1 :(得分:3)

快速看一下,我看到很多地方可能会出现这种情况。例如,这里:

while(list[head] < key)
    {
        ++head;
    }

想象一下key偶然是列表中最大元素的列表。然后该循环将运行,直到head超过数组的末尾,此时可以随时发生段错误。同样,以下循环可能导致tail移出数组的开头。

答案 2 :(得分:1)

除了由Luchian诊断出的保证堆栈溢出之外,还需要检查是否在内循环中没有运行数组:

while(head <= tail && list[head] < key)
while(head <= tail && list[tail] >= key)