-

- 基数排序不止于此,还有很多种方法,例如利用计数排序,哈希思想等
- 下面我们以最简单的一种实现进行讲解:
- #include
- #include
- #define Radix 10 //基数为0 ~ 9,总共10个数
- #define MaxDigit 3 //最大为3位的整数,即最大为999
- //提示:首先要明确操作的对象!!!
- //定义结构体节点
- typedef struct Node {
- int data;
- struct Node* next;
- } Node;
- /
- 🎯 从数组创建链表的新函数
- 避免手动输入,直接使用数组数据
- Node* CreateListFromArray(int arr[], int n) {
- Node p = NULL, r = NULL, *temp;
- for (int i = 0; i < n; i++) {
- temp = (Node*)malloc(sizeof(Node));
- temp->data = arr[i]; // 📋 直接从数组取值
- temp->next = NULL; //初始化为NULL
- r->next = temp; //把r后面连接上temp指向的结构体,操控了当前r指向的结构体内部的结构体指针的指向,先链接起节点
- r = temp; //然后转向用r来操控下一个节点,把下一个节点的地址交给r了,r可以操控它,转换操作对象
- void radixSort(Node *&p) {
- //先声明了桶的地址变量,可以存放地址进行关键操作啦
- Node h[Radix], t[Radix], *r;
- for (int i = 0; i < Radix; i++) {
- //初始化为NULL,防止指向随机内存,10个桶全部初始化首尾指针,抽象桶模型建立
- //基数级别建立,初始级别是个位,每次循环都乘以10,变成十位,百位...
- for (int d = 1; d <= MaxDigit; d++) {
- // 🎯 第一步:分配节点到各个队列(桶) -> 这里的桶要是队列,因为要先进先出
- int k = p->data / b % Radix; //取得基数,存到k处
- //检测当前这个桶里面是不是空的,空的话就直接把p赋值给h[k]和t[k],否则就把p赋值给t[k]->next,然后t[k]指向p,把p指向下一个节点
- // 🎯 第二步:收集各个队列,重组链表,按个位排序好
- for (int i = 0; i < Radix; i++) {
- r->next = h[i]; //有序地连接起来
- h[i] = t[i] = NULL; // 🧹 清空队列头尾指针
- if (r != NULL) r->next = NULL; // 🎯 确保链表结尾,NULL用来结尾
- 🎯 打印链表函数
- 保持原始链表不被破坏
- void printList(Node *p) {
- int arr[] = {6, 3, 8, 3, 2, 9, 6, 7, 8, 3, 2, 1};
- int n = sizeof(arr) / sizeof(arr[0]);
- for (int i = 0; i < n; i++) {
- Node *p = CreateListFromArray(arr, n);