inplace quick radix sort实现

时间:2013-12-18 07:47:25

标签: c++ sorting

我正在阅读以下链接中的二进制快速排序算法

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循环后进行额外检查。请求举例说明何时以及为何需要此条件。

1 个答案:

答案 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语句基本上说“好了,基数排序在这个级别上没有做任何事情,所以让我们再试一次,在下一个数字中包含一个分区中的所有元素。”

如果你没有这样做,那么你遗漏的元素将无法正确排序,因为你只用基数排序中感兴趣的数字进行分区。