数据结构与算法分析——c语言描述 第三章的基数排序
还是使用链表,特点是使用了基数排序的算法。去visualgo看一看算法动画什么都清楚了。代码参照了blackboy的。
link.h
typedef int ElementType; #ifndef _List_H #define _List_H struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; List MakeEmpty(List L); int IsEmpty(List L); int IsLast(Position P, List L); Position Find(ElementType X, List L); void Delete(ElementType X, List L); Position FindPrevious(ElementType X, List L); void Insert(ElementType X, List L, Position P); void DeleteList(List L); Position Header(List L); Position First(List L); Position Advance(Position P); ElementType Retrieve(Position P); void InsertFront(ElementType, List); void InsertBack(ElementType, List); #endif
#include"link.h" #include<stdlib.h> #include"fatal.h" struct Node { ElementType Element; Position Next; }; List MakeEmpty(List L) { if (L != NULL){ DeleteList(L); L->Next = NULL; return L; } else { L = malloc(sizeof(struct Node)); if (L == NULL) FatalError("Out of memory"); L->Next = NULL; return L; } } int IsEmpty(List L) { return L->Next == NULL; } int IsLast(Position P, List L) { return P->Next == NULL; } Position Find(ElementType X, List L) { Position P; P = L->Next; while (P != NULL&&P->Element != X) { P = P->Next; } return P; } void Delete(ElementType X, List L) { Position P; P = FindPrevious(X, L); if (!IsLast(P, L)) { Position TmpCell = P->Next; P->Next = TmpCell->Next; free(TmpCell); } } Position FindPrevious(ElementType X, List L) { Position P; P = L; while (P->Next != NULL&&P->Next->Element != X) P = P->Next; return P; } void Insert(ElementType X, List L, Position P) { Position tmpCell; tmpCell = malloc(sizeof(struct Node)); if (tmpCell == NULL) FatalError("Out of space!!"); tmpCell->Element = X; tmpCell->Next = P->Next; P->Next = tmpCell; } void DeleteList(List L) { Position p; p = L->Next; L->Next = NULL; while (p != NULL) { Position tmp; tmp = p->Next; free(p); p = tmp; } } Position Header(List L) { return L; } Position First(List L) { return L->Next; } Position Advance(Position P) { return P->Next; } ElementType Retrieve(Position P) { return P->Element; } void InsertFront(ElementType X, List L) { Insert(X, L, L); } void InsertBack(ElementType X, List L) { Position last; last = L; while (last->Next != NULL) last = last->Next; Insert(X, L, last); }
#include"link.h" #include<stdio.h> #define BUCKETS 10 //桶的数量 #define N 10//需要排序数字数量 #define BITS 3 //位数 void radixSort(int arr[]); int getDigital(int x, int cnt); void print(int arr[]); int main() { int arr[N]= { 64, 8, 216, 512, 27, 729, 0, 1, 343, 125 }; print(arr); radixSort(arr); print(arr); } void radixSort(int arr[]) { List bucket[BUCKETS]; int i,j,k; for (i = 0; i < BUCKETS; i++) { bucket[i] = MakeEmpty(NULL); } for (i = 0; i < BITS; i++) { for (j = 0; j < BUCKETS; j++) MakeEmpty(bucket[j]); for (k = 0; k < N; k++){ InsertBack(arr[k], bucket[getDigital(arr[k], i)]); } for (int i = 0,k=0; i < N; i++) { Position p; p = First(bucket[i]); while (p != NULL) { arr[k++] = Retrieve(p); p = Advance(p); } } } for (i = 0; i<BUCKETS; ++i) DeleteList(bucket[i]); } int getDigital(int x, int cnt) { for (int i = 0; i < cnt; i++) x /= 10; return x % 10; } void print(int arr[]){ for (int i = 0; i < N; i++) { printf("%d ", arr[i]); } printf("\n"); }