给定大量数字时,基数排序无法正确排序

Posted

技术标签:

【中文标题】给定大量数字时,基数排序无法正确排序【英文标题】:Radix sort not sorting properly when given lots of numbers 【发布时间】:2020-03-31 19:24:02 【问题描述】:

我必须为我的作业实现二进制基数排序。虽然我已经让它工作了,但一旦它遇到大量数字(通常是 300+),它就会停止正确排序(实际上并没有对它们进行排序)。有谁知道问题出在哪里?

vector<unsigned char> A; //gets input from file that we have been given, containing 1000 numbers
vector<unsigned char> C(2);
vector<unsigned char> B(A.size());

for (int i = 0; i < A.size(); i++) 
    B.push_back(0);


for (int k = 0; k < 8; k++) 
    C[0] = 0;
    C[1] = 0;

    for (int i = 0; i < A.size(); i++) 
        C[((int)A[i] >> k) & 1]++;
    

    C[1] += C[0];

    for (int j = A.size() - 1; j >= 0; j--) 
        B[--C[(int)(A[j] >> k) & 1]] = (int)A[j];
    

    std::swap(A, B);

经过一些测试,似乎限制为 256 个数字。所以当超过 256 个数字时,算法就不能再排序了

【问题讨论】:

当你说它停止时,会发生什么?它会出错吗?就挂了?请详细说明您的问题也是问题 它实际上并没有对它们进行排序,您可以找到已排序但整个序列未排序的子组。而当我的数字少于 300 个时,整个序列是完美排序的...... 您最初的B 数组中的元素过多,以后可能会出现问题。 不将其初始化为全 0 / 每次运行后清除它,没有帮助,所以我认为这不是问题...... 经过一些测试,似乎限制为256个数字。所以当超过 256 个数字时,算法就不能再排序了 【参考方案1】:

查看声明和用法

vector<unsigned char> C(2);
B[--C[(int)(A[j] >> k) & 1]]

任何元素 C[i] 包含介于 0 和 255 之间的 N。因此索引 --C[(int)(A[j] &gt;&gt; k) &amp; 1] 始终小于 255。

解决方案:

vector<size_t> C(2);

【讨论】:

以上是关于给定大量数字时,基数排序无法正确排序的主要内容,如果未能解决你的问题,请参考以下文章

大量数据常采用的高效排序算法:桶排序计数排序基数排序

为啥基数排序不能首先按最高有效数字进行桶排序[重复]

基数排序不排序“一些”数字?

基数排序和更改基数

基数排序(radixSort)

对 32 位数字使用基数排序