首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

字符排序算法实战:数字优先、大小写敏感的自定义排序实现

     編輯:程式設計綜合問答

题目背景与需求分析

在编程实践中,常遇到需要对混合字符(数字、大小写字母)进行自定义排序的场景。本题要求:随机生成70个字符存入数组,字符集包含0-9、A-Z、a-z共62种字符,按特定规则排序输出。排序优先级为:数字 > 大写字母 > 小写字母,同类字符按自然顺序排列。

核心算法设计

采用计数排序思想,利用字符集有限(仅62种)的特性,建立长度为62的计数数组 temp[62] 记录每种字符出现次数。映射规则:

  • 索引 0-9 对应字符 '0'-'9'
  • 索引 10-35 对应 'A'-'Z'
  • 索引 36-61 对应 'a'-'z'

此映射天然满足题目排序优先级要求,遍历计数数组即可按序重建有序数组。

完整代码实现

#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 全集,仅需调整数组大小与映射逻辑即可复用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved