问题描述
void Counting_Sort(vector<int>& A)
{
const int size = A.size();
int max = A[0];
for (int i = 1; i < size; i++)
if (max > A[i])
max = A[i];
int* C = new int[max + 1]{ 0 };
for (int i = 0; i < max + 1; i++)
C[A[i]] = C[A[i]] + 1;
for (int i = 1; i < max + 1; i++)
C[i] = C[i] + C[i - 1];
int* B = new int[size];
for (int i = size-1; i >= 0; i--)
B[C[A[i]] - 1] = A[i]; // <-- Warning here
}
我不确定为什么会收到警告或它的确切含义。将 for 循环中的 size-1 设置为 size-2 会消除警告,但我不明白为什么。
解决方法
我注意到您的示例代码存在四个不同的问题:
- 最大值的计算不正确。您的情况应该是测试
if (A[i] > max)
- 计数排序算法的“累积步骤”应该迭代输入数据。也就是说,循环应该如下(最多
size
,而不是max + 1
):
for (int i = 0; i < size; i++)
C[A[i]] = C[A[i]] + 1;
- 算法的最终循环忘记更新每个“计数排序箱”的目的地。也就是说,最终的循环应该如下所示:
for (int i = size - 1; i >= 0; i--) {
B[C[A[i]] - 1] = A[i];
C[A[i]] = C[A[i]] - 1;
}
- 完成后不要忘记在
delete[]
和B
上使用C
。
这是完全编辑的结果:
#include <iostream>
#include <vector>
void Counting_Sort(std::vector<int>& A) {
const int size = A.size();
int max = A[0];
for (int i = 1; i < size; i++)
if (A[i] > max)
max = A[i];
int* C = new int[max + 1]{ 0 };
for (int i = 0; i < size; i++)
C[A[i]] = C[A[i]] + 1;
for (int i = 1; i < max + 1; i++)
C[i] = C[i] + C[i - 1];
int* B = new int[size];
for (int i = size-1; i >= 0; i--) {
B[C[A[i]] - 1] = A[i];
C[A[i]] = C[A[i]] - 1;
}
for (int i = 0; i < size; i++)
std::cout << "B[" << i << "] is " << B[i] << "\n";
delete[] B;
delete[] C;
}
int main() {
std::vector<int> A = {6,1,3,6,9};
Counting_Sort(A);
return 0;
}
,
编译器说 B 的大小是 4xsize 字节长,但在某些情况下,可能会写入 8 字节,这可能会超过 4xsize 字节长度。
以 A = {10} 为例。