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

标签 c algorithm sorting counting-sort

我编写此代码是为了在 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发现)

关于计数排序不对最后一个元素进行排序 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70825655/

相关文章:

c - 在C中退出处理程序

c - 为什么 printf is c 产生这个输出

algorithm - 基于单一输入颜色生成类似配色方案的算法是什么?

algorithm - 如何找到具有最多共同项的子集?

r - 如何按列顺序对 tibble 进行排序? (第一列,第二列,第三列......)

c - 如何使用正确的参数在 C 中调用 execl()?

c - 有没有办法知道目标文件中导出了哪些符号?

python - 寻找 8 个元素的最佳可能组合,8 个列表中的每一个

c++ - 对输入的名称 'age' 进行排序,然后显示结果

ruby-on-rails - 有没有办法强制 Rails 中的测试顺序?