递减计数排序算法中的元素计数

Decrementing counts of elements in counting sort algorithm

本文关键字:元素 排序 算法      更新时间:2023-10-16

我从伪代码中实现了计数排序算法。在伪代码中,最后一个循环在第一次传递后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;
}
for(int j = size-1; j >= 0; j--) {
    B[--C[A[j]]] = A[j];
}

相当于:

for(int j = size-1; j >= 0; j--) {
    int element = A[j];
    int pos = C[element] - 1; 
    B[pos] = element;
    C[element]--;
}

想象一下数组1 0 1.现在元素计数如下:
0 - 1次
1 - 2 次

仓位增量的准备按其前面的元素数量计算:
0 - 1
1 - 3

元素在新(排序)数组中的位置现在为(计数 - 1):
0的位置 = 1 - 1 = 0
第一1的位置 = 3 - 1 = 2
第二1的位置 = 2 - 1 = 1

让它0 1 1.

相关文章: