计数排序不对最后一个元素进行排序 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 发现)
我编写这段代码是为了在 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 发现)