如果我只需要对由ASCII字符组成的字符串进行排序,想知道使用最高有效和最低有效基数排序之间有什么区别?我认为它们应该具有相同的结果,但是会被下面链接中的以下语句所混淆,如果有人可以帮助澄清,那就太好了。
https://zh.wikipedia.org/wiki/Radix_sort
最高有效数字(MSD)基数排序可用于按字典顺序对键进行排序。与最低有效数字(LSD)基数排序不同,最高有效数字基数排序不一定保留重复键的原始顺序。
预先感谢林
LSD基数排序可以在每次通过后逻辑上合并排序的bin(如果使用计数/基数排序,则将它们视为单个bin)。MSD基数排序必须在每次通过后对每个bin进行递归排序。如果按字节排序,则第一遍后为256个bin,第二遍后为65536个bin,第三遍后为16777216(1600万)个bin,…。
这就是为什么旧卡分类器首先对数据LSD进行分类的原因。链接到其中之一的视频。卡片被送入并朝下放入滑槽。在视频中,卡片分类器将卡片放入“ 0”到“ 9”的纸箱中,然后操作员从0纸箱中取出纸牌,然后从1纸箱中取出纸牌并将其放置在0纸箱的顶部(后面)卡,然后将2个垃圾箱卡放到甲板后面,依此类推,将垃圾箱中的卡“级联”。对于较大的卡片组,在卡片分类机上方将在每个纸箱上方设置架子,以在卡片组太大而无法手持时放置卡片。
示例C ++ LSD基数对32位无符号整数进行排序,其中每个“数字”都是一个字节。大多数代码会生成一个计数矩阵,该矩阵转换为标记可变大小仓位之间边界的索引。实际的基数排序位于最后一个嵌套循环中。
// a is input array, b is working array uint32_t * RadixSort(uint32_t * a, uint32_t *b, size_t count) { size_t mIndex[4][256] = {0}; // count / index matrix size_t i,j,m,n; uint32_t u; for(i = 0; i < count; i++){ // generate histograms u = a[i]; for(j = 0; j < 4; j++){ mIndex[j][(size_t)(u & 0xff)]++; u >>= 8; } } for(j = 0; j < 4; j++){ // convert to indices m = 0; for(i = 0; i < 256; i++){ n = mIndex[j][i]; mIndex[j][i] = m; m += n; } } for(j = 0; j < 4; j++){ // radix sort for(i = 0; i < count; i++){ // sort by current lsb u = a[i]; m = (size_t)(u>>(j<<3))&0xff; b[mIndex[j][m]++] = u; } std::swap(a, b); // swap ptrs } return(a); }