小编典典

最重要和最不重要的基数排序

algorithm

如果我只需要对由ASCII字符组成的字符串进行排序,想知道使用最高有效和最低有效基数排序之间有什么区别?我认为它们应该具有相同的结果,但是会被下面链接中的以下语句所混淆,如果有人可以帮助澄清,那就太好了。

https://zh.wikipedia.org/wiki/Radix_sort

最高有效数字(MSD)基数排序可用于按字典顺序对键进行排序。与最低有效数字(LSD)基数排序不同,最高有效数字基数排序不一定保留重复键的原始顺序。

预先感谢林


阅读 323

收藏
2020-07-28

共1个答案

小编典典

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);
}
2020-07-28