C++ 就地快速基数排序实现

C++ 就地快速基数排序实现,c++,sorting,C++,Sorting,我在下面的链接中阅读有关二进制快速排序算法的内容 quicksortB(inta[],intl,intr,intw) { int i=l,j=r; 如果(r)返回; while(j!=i) { 而(数字(a[i],w)==0&&(ii))j--; exch(a[i],a[j]); } 如果(数字(a[r],w)==0)j++;//**这里的问题** 快速通道B(a、l、j-1、w+1); 快速入门B(a、j、r、w+1); } 我的问题是,为什么在提供循环时在之后附加检查。请求给出需要此条

我在下面的链接中阅读有关二进制快速排序算法的内容

quicksortB(inta[],intl,intr,intw)
{ 
int i=l,j=r;
如果(r)返回;
while(j!=i)
{
而(数字(a[i],w)==0&&(ii))j--;
exch(a[i],a[j]);
}
如果(数字(a[r],w)==0)j++;//**这里的问题**
快速通道B(a、l、j-1、w+1);
快速入门B(a、j、r、w+1);
}

我的问题是,为什么在提供循环时在
之后附加检查。请求给出需要此条件的时间和原因的示例。

当分区中的所有元素都具有相同的
数字(a[…],w)
时会发生什么情况

当这种情况发生时,在
while(j!=i)
循环之后,
j
将指向该分区的最后一个元素,因此
quicksortB(a,l,j-1,w+1)
将省略该元素,而
quicksortB(a,j,r,w+1)
将使用一个元素对范围进行排序

不过,在这种特殊情况下,您需要将具有相同前导数字的所有元素放在一个分区中,以便第一个
quicksortB()
调用将对它们进行排序。当您这样做时,第二个
quicksortB()
将得到一个空分区,并且什么也不做,这是安全的。这就是您突出显示的
if
语句所实现的

换句话说,
if
语句基本上是说“好的,基数排序在这个级别上什么都没有做,所以让我们在下一个数字上用一个分区中的所有元素再试一次。”

如果不这样做,那么遗漏的元素将无法正确排序,因为在基数排序中只按感兴趣的数字进行了分区

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);
}