题目描述 采用基数排序算法对0~999之间的整数序列从小到大进行排序。 输入 多组测试数据,直到输入文件结束。每组测试数据占用一行,包括若干个待排序的正整数。每组测试数据以-1结束(-1不包括在测试数据内) 输出 输出排序后的结果,要求依次打印每阶段的排序结果,数据间以一个空格隔开,行末无空格。 样例输入 73 207 934 452 55 1 286 65 394 81 -1 样例输出 1 81 452 73 934 394 55 65 286 207 1 207 934 452 55 65 73 81 286 394 1 55 65 73 81 207 286 394 452 934 提示 借鉴多关键字排序的思想,将单关键字按某种基数分解成“多关键字”,然后借助“分配”和“收集”两种操作进行排序。用c语言完成该代码
时间: 2024-03-05 15:49:38 浏览: 182
```c
#include <stdio.h>
#include <stdlib.h> // 包含rand()和srand()函数
#include <time.h> // 包含time()函数
// 基数排序函数,sort_key为排序关键字,num为待排序元素个数
void radix_sort(int sort_key, int num) {
int arr[num], bucket[10][num], bucket_count[10], divisor = 1;
// arr为待排序的数组,bucket为桶,bucket_count为每个桶中元素的个数
// divisor为当前排序关键字的位数
// 初始化桶中元素个数为0
for (int i = 0; i < 10; i++) {
bucket_count[i] = 0;
}
// 生成随机数并存储到待排序数组中
srand(time(NULL)); // 设置种子
printf("待排序数组:");
for (int i = 0; i < num; i++) {
arr[i] = rand() % 1000; // 随机生成0~999的整数
printf("%d ", arr[i]);
}
printf("\n");
// 进行基数排序
while (sort_key--) {
// 分配操作
for (int i = 0; i < num; i++) {
int digit = (arr[i] / divisor) % 10; // 获取当前排序关键字位上的数字
bucket[digit][bucket_count[digit]] = arr[i]; // 将当前元素存储到对应的桶中
bucket_count[digit]++; // 桶中元素个数+1
}
// 收集操作
int index = 0;
for (int i = 0; i < 10; i++) {
if (bucket_count[i] != 0) { // 如果当前桶中有元素
for (int j = 0; j < bucket_count[i]; j++) {
arr[index] = bucket[i][j]; // 将桶中的元素依次存储到待排序数组中
index++;
}
bucket_count[i] = 0; // 将桶中元素个数清零
}
}
// 打印当前阶段的排序结果
printf("第%d阶段排序结果:", (divisor == 1) ? 1 : (sort_key + 2));
for (int i = 0; i < num; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 更新排序关键字的位数
divisor *= 10;
}
}
int main() {
int sort_key, num;
while (scanf("%d", &sort_key) != EOF) {
if (sort_key == -1) { // 输入-1表示结束
break;
}
scanf("%d", &num);
radix_sort(sort_key, num);
}
return 0;
}
```
阅读全文