栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637482.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号