我一直在研究基数排序实现(到目前为止粘贴的代码如下)。代码是用 Java 编写的,但在 C/C++ 中应该也能正常工作。正如你从实现中看到的,我首先做的是最重要的位,整数的第 31 位。这似乎更快,因为一旦一个子组完成,它就不再需要迭代。
例如,打个比方,想象一下对单词进行排序,并且您只有一个以“A”开头的单词。一旦您看到 A 并将单词放在列表的开头,您就不再需要检查单词中的任何其他字符。另一方面,如果您从单词的末尾开始,您将不得不查看每个字母,然后才能确定它属于列表的开头。
所以,基于这个想法,我认为 MSB 订单会是最快的,但我错过了什么吗?由于某种原因,LSB 是否也一样快?我知道 LSB 执行“稳定排序”,但我认为这没有任何实际好处。
public static final int[] RadixSort_unsigned_1( int[] values1 ){ // one based key sorting
int[] keys = new int[ values1.length ];
int ctValues = values1[0];
keys[0] = ctValues;
for( int xKey = 1; xKey <= ctValues; xKey++ ) keys[xKey] = xKey;
int iFrameListSize = (int)Math.sqrt( (double)ctValues ) + 2;
int[] nextBottom = new int[ iFrameListSize ];
int[] nextTop = new int[ iFrameListSize ]; …Run Code Online (Sandbox Code Playgroud)