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

最重要和最不重要的基数排序,第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 arrayuint32_t * RadixSort(uint32_t * a, uint32_t *b, size_t count){size_t mIndex[4][256] = {0}; // count / index matrixsize_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);}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5643305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存