基数排序
#define MaxDight 4
#define Radix 10
typedef struct Node* PtrNode;
typedef PtrNode List;
struct Node { // 元素节点
int key;
PtrNode next;
};
struct headNode { //桶节点
PtrNode head;
PtrNode tail;
}Bucket[Radix];
int GetDigit(int X, int d) { //找到X的第d位数
for (int i = 1; i < d; i++) {
X = X/10;
}
return X % 10;
}
//低位优先排序
void initBucket() { //初始化桶
for (int i = 0; i < Radix; i++) {
Bucket[i].head = NULL;
Bucket[i].tail = NULL;
}
}
void minRadixSort(int A[],int n) { //n为数组的大小
//创建节点,加入链表
List list = (List)malloc(sizeof(struct Node));
PtrNode p, tmp;
tmp = list;
for (int i = 0; i < n; i++) { //将元素加入链表
p = (List)malloc(sizeof(struct Node));
p->key = A[i];
tmp->next = p;
tmp = p;
}
tmp->next = NULL;
//排序开始,低位开始
initBucket();
int D;
for (int i = 1; i <= MaxDigit; i++) {
p = list->next;
while (p) { //加入桶中
tmp = p;
p = p->next;
tmp->next = NULL;
D = GetDigit(tmp->key, i);
if (Bucket[D].head == NULL) {
Bucket[D].head = Bucket[D].tail = tmp;
}
else {
Bucket[D].tail->next = tmp;
Bucket[D].tail = tmp;
}
}
//将桶中元素导入链表
list->next = NULL;
tmp = list;
for (int i = 0; i < Radix; i++) {
if (Bucket[i].head != NULL) {
tmp->next = Bucket[i].head;
tmp = Bucket[i].tail;
Bucket[i].head = Bucket[i].tail = NULL;
}
}
}
//将排好序的链表中的元素导回数组中
p = list->next;
free(list);
for (int i = 0; i < n; i++) {
A[i] = p->key;
tmp = p;
p = p->next;
free(tmp);
}
}