【发布时间】:2019-10-24 18:55:24
【问题描述】:
我正在尝试实现快速排序算法(在 C# 中),这是我的代码:
public static void sort(ref int[] A)
{
if (A.Length==0 || A.Length==1)
{
return;
}
quickSort(ref A,0,A.Length-1);
}
private static void quickSort(ref int[] A, int left, int right)
{
if (left >= right || left < 0 || right < 0)
return;
int pivot = A[left];
int i = left - 1;
int j = right + 1;
while (true)
{
do
{
i++;
}
while (A[i] < pivot);
do
{
j--;
}
while (A[j] > pivot);
if (i >= j)
break;
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
quickSort(ref A,left,j);
quickSort(ref A, j + 1, right);
}
这个算法工作得很好,但是有些东西似乎不合逻辑,我选择pivot 等于A[left] 然后在while(true) 循环中我写了do{i++}while(A[i]<pivot),我现在注意到第一次它会增加@ 987654327@ 所以A[i] 将等于A[left] 这是枢轴值,所以这应该意味着这个do while 循环将在i 的第一个增量之后停止,所以当我尝试将= 运算符添加到while 使其在第一次递增后不会停止:while(A[i]<=) 我遇到了堆栈溢出异常(当我将相等运算符添加到第二个 do while 时,也遇到了堆栈溢出异常:while(A[j]>=pivot)),我不明白为什么会这样,谁能解释一下?
【问题讨论】:
-
请注意,
ref是不必要的,因为您永远不会分配给变量A。 (ref影响变量,而不是值。) -
我们将不得不保留它,因为我的老师说它,但我很想知道你所说的“ref 影响变量,而不是值”@Ry-
-
@DanielK see 那里。
-
@EdPlunkett 是的,我的代码工作正常,当我将
=运算符添加到while(true)内的两个while之一时,它停止工作并给我一个堆栈溢出异常 -
了解调试器的好时机。当它抛出堆栈溢出异常时,上一个堆栈并查看本地值是否符合您的预期。如果不是,那么您很可能处于无限循环(递归)
标签: c# algorithm stack-overflow quicksort