在编程实践中,常遇到需要对混合字符(数字、大小写字母)进行自定义排序的场景。本题要求:随机生成70个字符存入数组,字符集包含0-9、A-Z、a-z共62种字符,按特定规则排序输出。排序优先级为:数字 > 大写字母 > 小写字母,同类字符按自然顺序排列。
采用计数排序思想,利用字符集有限(仅62种)的特性,建立长度为62的计数数组 temp[62] 记录每种字符出现次数。映射规则:
此映射天然满足题目排序优先级要求,遍历计数数组即可按序重建有序数组。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 70
#define CHAR_SET_SIZE 62
int count[CHAR_SET_SIZE];
int main() {
int arr[MAX];
int i, j = 0;
srand((unsigned)time(NULL));
// 生成随机字符索引
for (i = 0; i < MAX; i++) {
arr[i] = rand() % CHAR_SET_SIZE;
}
// 打印原始字符
printf("随机生成的字符序列:\n");
for (i = 0; i < MAX; i++) {
if (arr[i] < 10) printf(" %c", '0' + arr[i]);
else if (arr[i] < 36) printf(" %c", 'A' + arr[i] - 10);
else printf(" %c", 'a' + arr[i] - 36);
}
printf("\n\n");
// 计数排序核心逻辑
for (i = 0; i < MAX; i++) count[arr[i]]++;
for (i = 0; j < MAX; i++) {
while (count[i] > 0) {
arr[j++] = i;
count[i]--;
}
}
// 打印排序结果
printf("排序后的字符序列:\n");
for (i = 0; i < MAX; i++) {
if (arr[i] < 10) printf(" %c", '0' + arr[i]);
else if (arr[i] < 36) printf(" %c", 'A' + arr[i] - 10);
else printf(" %c", 'a' + arr[i] - 36);
}
printf("\n");
return 0;
}

该算法时间复杂度 O(n+k),空间复杂度 O(k),其中 k=62 为字符集大小。适用于字符集较小、排序规则固定的场景,避免了通用排序算法的比较开销。若字符集扩大至 ASCII 全集,仅需调整数组大小与映射逻辑即可复用。