当我尝试实现计数排序时出现此错误“问题导致程序停止正常运行 Windows

问题描述

当我尝试实现计数排序时,出现此错误“问题导致程序停止正常工作,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;
}

this is the error

解决方法

  • i < SizeCi <SizeC 应该是 i <= SizeC。否则,将无法正确处理值为 SizeC 的元素。
  • C[i] += C[i - 1];i = 0 将导致超出范围的 C[-1] 读取。对应的for循环的初始化应该是int i = 1,而不是int i = 0
  • 减量 C[A[j]] --; 应该在 before B[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;
}