我正在调试我的代码,用于在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);
}
答案 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)