问题描述
当我尝试实现计数排序时,出现此错误“问题导致程序停止正常工作,Windows 将关闭程序并通知您是否有可用的解决方案”
void CountingSort(int *A,int size) {
int SizeC = Max(A,size);
int* B = new int[size];
int* C = new int[SizeC+1];
for (int i = 0; i < SizeC; i++) {
C[i] = 0;
}
for (int i = 0; i < size; i++) {
C[A[i]]++ ;
}
for (int i = 0; i <SizeC; i++)
{
C[i] += C[i - 1];
}
for (int j = size - 1; j >= 0; j--) {
B[C[A[j]]] = A[j];
C[A[j]] --;
}
for (int i = 0; i < size; i++) {
cout << B[i] << "\t" << endl;
}
delete[] C;
delete[] B;
}
解决方法
-
i < SizeC
和i <SizeC
应该是i <= SizeC
。否则,将无法正确处理值为SizeC
的元素。 -
C[i] += C[i - 1];
和i = 0
将导致超出范围的C[-1]
读取。对应的for
循环的初始化应该是int i = 1
,而不是int i = 0
。 - 减量
C[A[j]] --;
应该在 beforeB[C[A[j]]] = A[j];
之前发生,否则B[size]
会发生超出范围的写入。 - 当数组
A
包含负值时,此程序将无法正常工作。
固定代码(仍然不支持负值):
void CountingSort(int *A,int size) {
int SizeC = Max(A,size);
int* B = new int[size];
int* C = new int[SizeC+1];
for (int i = 0; i <= SizeC; i++) {
C[i] = 0;
}
for (int i = 0; i < size; i++) {
C[A[i]]++ ;
}
for (int i = 1; i <= SizeC; i++)
{
C[i] += C[i - 1];
}
for (int j = size - 1; j >= 0; j--) {
C[A[j]] --;
B[C[A[j]]] = A[j];
}
for (int i = 0; i < size; i++) {
cout << B[i] << "\t" << endl;
}
delete[] C;
delete[] B;
}