为什么我在基数排序中出现C6385错误

时间:2020-03-19 15:45:26

标签: c++ radix-sort

我正在尝试编写自己的基数排序版本,以便更好地理解算法。问题是,在第一个内部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();
            }
        }
    }
}

1 个答案:

答案 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优先。