0

疑似コードからカウントソートアルゴリズムを実装しました。疑似コードではC[A[j]]、最初のパスの後に最後のループが減少します。これはすべてを右にシフトしていたので、最初のパスの前にデバッグしてデクリメントし、正しい結果を生成しました。しかし、それが機能する以外に理由がわかりません。なぜ、後ではなく前に減らさなければならないのですか。

後にデクリメントした結果は次のとおりです。

10 1 0 6 8 3 2 0 9 4 
0 0 0 1 2 3 4 6 8 9 

そして、前にデクリメントすると:

10 1 0 6 8 3 2 0 9 4 
0 0 1 2 3 4 6 8 9 10

明らかに、最初はすべてが右にずれていたので、すべてを左に移動しましたが、そもそも正しい位置合わせにならないのはなぜですか?

int* counting_sort(int A[], int size, int k)
{
    int* B = new int[size];
    int* C = new int[k+1];
    for(int i = 0; i <= k; i++)
        C[i] = 0;
    for(int j = 0; j < size; j++) {
        C[A[j]]++;
    }
    for(int i = 1; i <= k; i++) {
        C[i] += C[i-1];
    }
    //print(C,k+1);
    for(int j = size-1; j >= 0; j--) {
        B[--C[A[j]]] = A[j];
    }
    delete [] C;
    return B;
}
4

1 に答える 1