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);}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)