我已经实现了一个整数数组的快速排序,如下所示:
public void Quicksort(int left, int right)
{
/* The recursive quicksort algorithm consists of four steps:
* 1. If there are one or less elements in the array to be sorted, return immediately.
* 2. Pick an element in the array to serve as a "pivot" point. (Usually the left-most element in the array is used.)
* 3. Split the array into two parts - one with elements larger than the pivot and the other with elements smaller than the pivot.
* 4. Recursively repeat the algorithm for both halves of the original array.
*/
int pivot = dataTable[left];
int l_hold = left;
int r_hold = right;
while (left < right)
{
while ((dataTable[right] >= pivot) && (left < right))
right--;
if (left != right)
{
dataTable[left] = dataTable[right];
left++;
}
while ((dataTable[left] <= pivot) && (left < right))
left++;
if (left != right)
{
dataTable[right] = dataTable[left];
right--;
}
}
dataTable[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot)
Quicksort(left, pivot - 1);
if (right > pivot)
Quicksort(pivot + 1, right);
}
它运行正常,例如,500 000个随机生成的整数。 如果我用升序或降序整数填充数组,则快速排序会导致大约8800个元素的StackOverflowException。
我用我的小眼睛窥探没有明确的理由。你可以用大量的眼睛来窥探一个理由吗?我可以去找一个运行快速排序的copypasta,但我宁愿找出导致问题的原因。
该方法适用于作为类的一部分的数组,通常使用(索引0,最后一个索引-1)调用。提前数千的感谢!
答案 0 :(得分:0)
您正在体验Tail递归。简而言之,C#编译器不能很好地完成它。我已经读过如果你在调试中遇到这个问题,你可以尝试在发布模式下进行优化编译,这样可以缓解这个问题。
有更详细的信息here。
答案 1 :(得分:0)
您需要添加停止条件。
function() {
if(value == 0) {
break;
} else {
function())
}
你不能一直打电话给Quicksort。它需要停止/休息条件。