c++ - 就地快速基数排序实现

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

最佳答案

当分区中的所有元素都具有相同的 digit(a[...], w) 时会发生什么?

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

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

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

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

关于c++ - 就地快速基数排序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20652365/

相关文章:

c++ - 在 Lua 中创建和访问存储在 C++ 程序中的 Lua 对象

由 C++ Python 3 绑定(bind)

c++ - 如何获取蓝牙HID设备的MAC地址?

c++ - 使用 libpng 将位图缓冲区快速编码为 png

c# - 将 Linq 逻辑压缩到一个查询中

python - GTK - Python Treeview 排序列数据(文件大小 - 字节数据)

c - 对 argv 中的值进行排序

java - 在 java JNA 中用什么代替 LPTSTR?

arrays - 以最少的移动次数对一组磁盘进行排序

actionscript-3 - 在 ActionScript 3 中对对象向量进行排序