我有这段代码
public static void quicksort(int[] array){
quicksort(array, 0, array.length - 1);
}
public static void quicksort(int[] array, int min_index, int max_index){
if(array.length <= 1 || min_index >= max_index){
return;
}
int pivot = array[(max_index + min_index) / 2];
int left = min_index;
int right = max_index;
while(left <= right){
while(array[left] < pivot)
left++;
while(array[right] > pivot)
right--;
if( left <= right ){
int aux = array[left];
array[left] = array[right];
array[right] = aux;
left++;
right--;
}
}
if(right > min_index)
quicksort(array, min_index, right);
if(left < max_index)
quicksort(array, left, max_index);
}
哪个工作得很好,但如果我将数据库更改为pivot = array[0];
,它会中断,给我一个stackoverflow异常。我尝试了其他值,它似乎只是喜欢中间点。为什么会这样?
答案 0 :(得分:0)
这是Quicksort的一个众所周知的问题。对于某些输入,例如排序(或几乎排序)的数据,以及选择不当的枢轴点,Quicksort将退化为冒泡排序。由于函数是递归的,因此很容易生成堆栈溢出条件(或者在O(n 2 )时间内执行排序)。 Quicksort的教科书示例在这方面是臭名昭着的。 Quicksort做了很好的编程练习,但是你应该总是使用编译器提供的实现。
有关Quicksort的更多信息,请参阅Wikipedia文章。