欢迎指出代码不足
参考书本:严蔚敏《数据结构 .C语言版》
// RadixSort.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#define MAX_SIZE 1000//最大空间
#define RADIX10//关键字基数
#define KEY_NUM 3//关键字个数struct SLNode{//静态链表节点
int key;
int next;
};
struct SLList{//静态链表
SLNode base[MAX_SIZE];
int keyNum;
//关键字数量
int len;
};
typedef int Arrtype [RADIX];
//指针数组void initList(SLList * list,int * array,int num){
for (int i = 0;
i < num;
i++){
list->base[i].next = i + 1;
list->base[i+1].key = array[i];
}
list->base[num].next = 0;
list->len = num;
list->keyNum = 3;
}int ord(int key,int i){//获取地址 (0~9 )
if (i == 0){
return key % 10;
}
else if(i == 1){
return key % 100 / 10;
}
else{
return key / 100;
}
}//分配函数
//i : 关键字 次数
//f: 队头指针数组
//e:队尾指针数组
void distribute(SLList * list,int i,Arrtype * f,Arrtype * e){
for (int j = 0;
j < RADIX;
j++) (*f)[j] = 0;
//清空队头数据
int next = list->base[0].next;
for (;
next != 0;
next = list->base[next].next){
int index = ord(list->base[next].key,i);
if ((*f)[index] == 0){
(*f)[index] = next;
}
else{
list->base[(*e)[index]].next = next;
}
(*e)[index] = next;
}
printf("\n");
}int getNext(Arrtype f,int i){
for ( ;
i < RADIX;
i++) {
if (f[i] != 0){
return i;
}
}
return -1;
}//收集函数(分配函数 已经 将 需要排序的 数组 分块了,现在 需要 将这些 块 链接起来)
void collect(SLList * list,Arrtype f,Arrtype e){
int first = getNext(f,0);
if (first != -1){
list->base[0].next = f[first];
//设置 头指针的后继
int next = getNext(f,first+1);
int pre = first;
for (;
next != -1;
){
list->base[e[pre]].next = f[next];
pre = next;
next = getNext(f,next+1);
}
list->base[e[pre]].next = 0;
//设置最后节点的后继 为 0
}}void printList(SLList list){
printf("------------------打印静态链表--------------------\n");
int next = list.base[0].next;
while (next != 0){
SLNode nextNode = list.base[next];
printf("%d\t",nextNode.key);
next = nextNode.next;
}
printf("\n");
}void radixSort(SLList * list){
Arrtype f;
Arrtype e;
for (int i = 0;
i < list->keyNum;
i++){
distribute(list,i,&f,&e);
//分配,时间复杂度 O(n),n为 排序数组的大小
collect(list,f,e);
//收集...
printList(*list);
}
}static int testArray[] = {656,301,305,998,999,875,832,423,432,565};
int _tmain(int argc, _TCHAR* argv[])
{
SLList list;
initList(&list,testArray,10);
radixSort(&list);
return 0;
}
运行截图: 打印了 3次 静态链表,分别 是 对 “个位”,“十位”,“百位” 分配,收集之后 静态链表的情况。
【看数据结构写代码(65) 基数排序】
文章图片
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔