// 特点:只能用于非负数的排序
void countingSort(int array[], int size)
{
    // step 1:找出待排序数组中最大的值,确定数据的范围
    int max = array[0];
    for (int i= 1; i<size ; ++i) {
        if(max < array[i])
            max = array[i];
    }

    // step 2:申请数据范围大小的桶
    int *c = new int[max + 1] {0};

    for (int i=0; i<size; ++i) {
        c[array[i]]++;
    }

    // step 3:对桶计数累计
    for (int i=1; i <= max; ++i) {
          c[i] = c[i-1] + c[i];
    }

    // step 4:临时数组 r,存储排序之后的结果 int[] r
    int *r = new int[size] {0};
    for (int i=size-1; i>=0; --i) {
        int index = c[array[i]] - 1;
        r[index] = array[i];
        c[array[i]]--;
    }

    // step 5:排序后数据拷贝回原数组
    for (int i=0; i<size; ++i) {
        array[i] = r[i];
    }

    delete [] c;
    return ;
}

int main()
{
    int array[7] = {10, 122, 211, 120, 22, 23, 120};
    int size = sizeof (array) / sizeof (*array);

    printArray(array, size);

    countingSort(array, size);

    printArray(array, size);

    return 0;
}


备份地址: 【O(n+k)排序:计数