我正在阅读以下链接中的二进制快速排序算法
http://www.cs.princeton.edu/courses/archive/spr02/cs226/lectures/radix.4up.pdf
quicksortB(int a[], int l, int r, int w)
{
int i = l, j = r;
if (r <= l || w > bitsword) return;
while (j != i)
{
while (digit(a[i], w) == 0 && (i < j)) i++;
while (digit(a[j], w) == 1 && (j > i)) j--;
exch(a[i], a[j]);
}
if (digit(a[r], w) == 0) j++; //** question here.**
quicksortB(a, l, j-1, w+1);
quicksortB(a, j, r, w+1);
}
我的问题为什么在提供while
循环后进行额外检查。请求举例说明何时以及为何需要此条件。
答案 0 :(得分:2)
当分区中的所有元素具有相同的digit(a[...], w)
时会发生什么?
当发生这种情况时,在while (j != i)
循环之后,j
会指向该分区的最后一个元素,因此quicksortB(a, l, j-1, w+1)
会将该元素排除在外,quicksortB(a, j, r, w+1)
将使用一个元素对范围进行排序。
但是,在这种特殊情况下,您需要将具有相同前导数字的所有元素放入一个分区,以便第一个quicksortB()
调用对它们进行排序。当你这样做时,第二个quicksortB()
将得到一个空分区,什么都不做,这是安全的。这就是您突出显示的if
语句完成的内容。
换句话说,if
语句基本上说“好了,基数排序在这个级别上没有做任何事情,所以让我们再试一次,在下一个数字中包含一个分区中的所有元素。”
如果你没有这样做,那么你遗漏的元素将无法正确排序,因为你只用基数排序中感兴趣的数字进行分区。