C语言实现按照药品编号基数排序
时间: 2023-08-20 15:15:53 浏览: 99
以下是 C 语言实现按照药品编号基数排序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 1000
#define MAX_LEN 10
// 获取药品编号的数字部分
int get_num(char *str) {
int len = strlen(str);
int num = 0;
for (int i = 0; i < len; i++) {
if (str[i] >= '0' && str[i] <= '9') {
num = num * 10 + (str[i] - '0');
}
}
return num;
}
// 获取药品编号的基数部分
char get_key(char *str) {
return str[0];
}
// 按照数字部分排序
void radix_sort_num(char **arr, int n) {
int max_num = 0;
for (int i = 0; i < n; i++) {
int num = get_num(arr[i]);
if (num > max_num) {
max_num = num;
}
}
int k = 1;
while (k <= max_num) {
int buckets[10][MAX_N] = {0};
int count[10] = {0};
for (int i = 0; i < n; i++) {
int digit = (get_num(arr[i]) / k) % 10;
int index = count[digit]++;
strcpy(buckets[digit][index], arr[i]);
}
int index = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < count[i]; j++) {
strcpy(arr[index++], buckets[i][j]);
}
}
k *= 10;
}
}
// 按照基数部分排序
void radix_sort_key(char **arr, int n) {
int max_key = 0;
for (int i = 0; i < n; i++) {
char key = get_key(arr[i]);
if (key > max_key) {
max_key = key;
}
}
int k = 1;
while (k <= max_key) {
int buckets[26][MAX_N] = {0};
int count[26] = {0};
for (int i = 0; i < n; i++) {
char key = get_key(arr[i]);
int index = count[key-'A']++;
strcpy(buckets[key-'A'][index], arr[i]);
}
int index = 0;
for (int i = 0; i < 26; i++) {
for (int j = 0; j < count[i]; j++) {
strcpy(arr[index++], buckets[i][j]);
}
}
k++;
}
}
int main() {
char arr[MAX_N][MAX_LEN];
int n;
printf("请输入药品数量:");
scanf("%d", &n);
printf("请输入药品编号:\n");
for (int i = 0; i < n; i++) {
scanf("%s", arr[i]);
}
radix_sort_num(arr, n);
radix_sort_key(arr, n);
printf("按照药品编号基数排序的结果:\n");
for (int i = 0; i < n; i++) {
printf("%s\n", arr[i]);
}
return 0;
}
```
这里同样假设药品编号由一个字母和一个数字组成,中间没有空格隔开。首先按照数字部分排序,使用基数排序的思想,每次只取数字的一位进行排序,直到所有位数都被排序完毕。然后按照基数部分排序,同样使用基数排序的思想,每次只取基数的一位进行排序,直到所有位数都被排序完毕。最终得到的排序结果即为按照药品编号基数排序的结果。
阅读全文