计数排序不对最后一个元素进行排序 C

Counting sort does not order the last element C

我编写这段代码是为了在 C 中实现计数排序。但是它似乎无法正常工作。 我创建了一个包含 10 个元素的数组,然后应用计数排序步骤。基本上它对第一个元素进行排序,然后作为最后一个元素使用原始数组的最后一个元素。我不明白问题出在哪里。 代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    // create an array of 100 random elements
    // int my_array[10];
    int my_array[] = { 10, 10, 9, 9, 6, 5, 4, 3, 2, 1 };
    srand(time(NULL));
    int i;
    int N = 10;

    /* for (i = 0; i < 10; i++) {
        my_array[i] = rand() % 100 + 1;
    } */

    // print the array 
    for (i = 0; i < 10; i++) {
        printf("%d\n", my_array[i]);
    } 

    // define the minimum and the maximum as the first element of the array
    int min_array = my_array[0];
    int max_array = my_array[0];

    printf("--------------\n");

    // find the minimum and the maximum of the array
    for (i = 0; i < N; i++) {
        if (my_array[i] < min_array) {
            min_array = my_array[i];
        }
        else if (my_array[i] > max_array) {
            max_array = my_array[i];
        }
    }

    // check if it worked
    printf("max_array %d\n", max_array);
    printf("min_array %d\n", min_array);

    //
    int range_array;
    range_array = max_array - min_array + 1;
    int count_array[range_array + 1];

    for (i = 0; i < range_array; i++)
        count_array[i] = 0;

    int j = 0;
    
    for (int i = 0; i < 10; i++) {
        count_array[my_array[i] - min_array] = count_array[my_array[i] - min_array] + 1;
    }
    
    int z = 0;

    for (i = min_array; i < max_array; i++) {
        for (j = 0; j < count_array[i - min_array]; j++)
            my_array[z++] = i;
            
        // z = z + 1;
    }

    for (i = 0; i < N; i++) {
        printf("%d\n", my_array[i]);
    }
}

以及一种可能的输出:

10 10 9 9 6 5 4 3 2 1
--------------
max_array 10
min_array 1
--------------
1 2 3 4 5 6 9 9 2 1

所以你可以看到从 1 到 9 的数字是有序的,而最后一个 10 没有排序,它使用第一个数字,所以 1 和 2。

重建数组时,您希望包含值为 max_array 的元素。

i<max_array

应该是

i<=max_array

附带说明一下,您永远不会使用 count_array 的最后一个元素,因此它应该小一个元素。

int count_array[range_array + 1];

应该是

int count_array[range_array];

(由@user3386109 发现)