我正在尝试编写自己的基数排序版本,以便更好地理解算法。问题是,在第一个内部for循环(“ j”)中,我在VS中收到C6385错误。我不知道如何改写该行以使其起作用。我在这里做什么错了?
警告是:
警告C6385:从'countQueues'中读取无效数据:可读 大小为“ 400”字节,但可以读取“ 4000”字节。
void radixSort(int arr[], int arraySize)
{
int countDigits = GetMax(arr, arraySize); //max number of digits
queue<int> countQueues[10];
int modulo = 1;
for (int i = 0; i < countDigits; i++)
{
modulo *= 10;
for (int j = 0; j < arraySize; j++) //store the values in the queues
{
countQueues[arr[j] % modulo].push(arr[j]); //error here
}
for (int k = 0; k < 10; k++) // move them back in the array
{
while (!countQueues[k].empty())
{
arr[i] = countQueues[k].front();
countQueues[k].pop();
}
}
}
}
答案 0 :(得分:1)
当modulo = 100时,请考虑第一个循环的第二次迭代。然后这行代码:
countQueues[arr[j] % modulo].push(arr[j]); //error here
可以尝试访问countQueues(最多99个),但是countQueues的大小为10。
这是尝试首先对基数排序最高有效位的问题。第一次迭代使用10个队列,第二次迭代使用100个队列,第三次迭代使用1000个队列,...,可以使用递归来简化这些迭代,但是会占用很多空间,将10个提高到countDigits幂。
首先使用基数排序的最低有效位数可以避免此问题。可以使用[countDigits] [10]矩阵。初始遍生成计数并将其存储到矩阵中,其中matrix [i] []是10个计数的数组,用于表示每个数字的出现次数(0到9)。这些计数被转换为每个逻辑仓的起始索引矩阵[i]。然后在countDigits传递中进行基数排序,最低有效位/ bin优先。