给定大量数字时,基数排序无法正确排序
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] >> k) & 1]
始终小于 255。
解决方案:
vector<size_t> C(2);
【讨论】:
以上是关于给定大量数字时,基数排序无法正确排序的主要内容,如果未能解决你的问题,请参考以下文章