未获得具有计数排序

时间:2017-10-18 16:15:25

标签: c++ sorting counting-sort

我正在研究计数排序算法。我已经设置了两个临时数组CBC用于计算原始数组中的数字出现的次数。然后,它使用C中的元素将A(原始数组)中的元素放入B中的正确位置。我在每次循环后打印countingSort函数打印C,以确保其中包含正确的值(它确实如此,我用小样本测试它)。当我在A的帮助下将B的元素插入C时,会出现此问题。

以下是我countingSort的功能:

注意:我将10个整数2 0 3 2 5 4 3 6 10的数组传递给函数,临时数组Bmaximum值(所以我知道要制作的大小C )和数组A

的大小
void countingSort(int A[], int B[], int k, int size){
    int C[k + 1];
    cout << "K: " << k << endl;

    for(int i = 0; i < k + 1; i++){
        C[i] = 0;
    }



    for(int i = 0; i < k + 1; i++){
        cout << C[i] << " ";
    }


    for(int i = 0; i < size; i++){
        C[A[i]] = C[A[i]] + 1;
    }

    cout << endl;


    for(int i = 0; i < k + 1; i++){
        cout << C[i] << " ";
    }


    for(int i = 0; i < k + 1; i++){
        C[i] = C[i] + C[i - 1];
    }


    cout << endl;
    for(int i = 0; i < k + 1; i++){
        cout << C[i] << " ";
    }



    for(int i = size + 1; i > 0; i--){
        B[C[A[i]]] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }


    cout << endl;
    for(int i = 0; i < size; i++){
        cout << B[i] << " ";
    }


}

正如您所看到的,我在每次循环后打印C,因此在第一次循环之后,它应显示C0 0 0 0 0 0,它会正确打印出来。在下一个for循环之后,C应为2 1 2 2 1 1 1,它也会正确打印出来。接下来,它会将C的元素添加到get 2 3 5 7 8 9 10,这也会正确打印出来。现在,当我尝试将A的元素放入B时,我的问题就出现了。它应该打印0 0 1 2 2 3 3 4 5 6,但它会打印0 0 0 1 0 2 3 3 4 5

我尝试在最后一个for循环中使用我的索引,但似乎无法弄清楚导致B错误的原因。我该如何解决这个问题?我的总体目标是让计数排序适用于随机生成的大小为40且数字介于1到25之间的数组。

编辑:我调用countingSort的主要功能:

int sizeCount1 = 10;
int countOne[10] = {2, 0, 3, 2, 5, 4, 3 ,6, 1, 0};

cout << "Counting Sort Version 1 (Pre Sort)" << endl;

for(int i = 0; i < sizeCount1; i++){
    cout << countOne[i] << " ";
}

cout << endl;


for(int i = 0; i < sizeCount1; i++){
    countTemp[i] = 0;
}



int max = 0;
for(int i = 0; i < sizeCount1; i++){
    if(countOne[i] > max){
        max = countOne[i];
    }
}

cout << "Max: " << max << endl;


countingSort(countOne, countTemp, max, sizeCount1);

cout << endl;

cout << "Counting Sort Version 1 (Post Sort)" << endl;


for(int i = 1; i < 10; i++){
    cout << countTemp[i] << " ";
}

cout << endl << endl;

1 个答案:

答案 0 :(得分:1)

myFunction[Int]("abc" -> 4 * 3) // 12

否则您将获得未定义的行为。

同样在输出数组中

for(int i = 1; i < k + 1; i++){
    C[i] = C[i] + C[i - 1];
}

你的算法正确。现在只是干了一下。这样您就可以在代码中找到这些错误。

由于OP使用了for(int i = size-1; i >= 0; i--){ B[C[A[i]]] = A[i]; C[A[i]] = C[A[i]] - 1; } 。我在答案

中使用了相同的内容

如果你不能使用0-indexing使用vector ..allocate内存。请仔细检查参考。

另一件事是无论何时你编码计数排序总是试图证明你可以保持辅助数组中的范围。这有帮助。

计算排序代码:

new

主要代码

void countingSort(int A[], int B[], int k, int size){
    int C[k + 1];
    for(int i = 0; i < k + 1; i++){
        C[i] = 0;
    }
    for(int i = 0; i < size; i++){
        C[A[i]] = C[A[i]] + 1;
    }
    for(int i = 0; i < k + 1; i++){
        C[i] = C[i] + C[i - 1];
    }
    for(int i = size-1; i >= 0; i--){
        B[C[A[i]]] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }
}