桶排序实现n个整数,寻找最小的k个数c语言代码实现
时间: 2024-01-27 11:05:07 浏览: 69
桶排序C语言实现
以下是C语言实现桶排序找最小的k个数的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void bucket_sort(int arr[], int n, int k) {
int max_num = INT_MIN, min_num = INT_MAX;
for (int i = 0; i < n; i++) {
if (arr[i] > max_num) {
max_num = arr[i];
}
if (arr[i] < min_num) {
min_num = arr[i];
}
}
int bucket_size = (max_num - min_num) / k + 1;
int **buckets = (int **)malloc(bucket_size * sizeof(int *));
for (int i = 0; i < bucket_size; i++) {
buckets[i] = (int *)malloc(n * sizeof(int));
}
int *counters = (int *)malloc(bucket_size * sizeof(int));
for (int i = 0; i < bucket_size; i++) {
counters[i] = 0;
}
for (int i = 0; i < n; i++) {
int index = (arr[i] - min_num) / k;
buckets[index][counters[index]] = arr[i];
counters[index]++;
}
int count = 0;
for (int i = 0; i < bucket_size; i++) {
for (int j = 0; j < counters[i]; j++) {
arr[count] = buckets[i][j];
count++;
if (count == k) {
break;
}
}
if (count == k) {
break;
}
}
for (int i = 0; i < bucket_size; i++) {
free(buckets[i]);
}
free(buckets);
free(counters);
}
int main() {
int arr[] = { 5, 2, 8, 3, 9, 1, 6, 4, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 4;
bucket_sort(arr, n, k);
printf("The smallest %d numbers are: ", k);
for (int i = 0; i < k; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
在这个示例代码中,我们先找到输入数组中的最大值和最小值,然后根据最大值和最小值计算出桶的大小。然后我们创建一个二维数组buckets来保存桶,一个一维数组counters来保存每个桶中元素的数量。接下来,我们将输入数组中的元素分配到各个桶中,然后按照桶的顺序将桶中的元素合并到输入数组中。最后,我们释放桶和计数器的内存。
在main()函数中,我们定义了一个输入数组arr和一个整数k。我们将arr和数组的大小n传递给bucket_sort()函数,然后输出最小的k个数字。
阅读全文