数据结构与算法分析——c语言描述 第三章的基数排序
之前写过了,但当时发现时间主要用在找到最后一个元素,今天重新写了,保存一个指向最后结点的指针。
last指针的初始值要非常小心啊,一开始我是初始值为NULL。这样有一个问题,就是插入第一个元素的时候(头结点版链表),last指针是不会更新的!islast函数我是判断是否和last指针相等。debug了一整天,一开始想都想不明白,后来才大概摸到方向。智商捉急。。。。
list.h
typedef int ElementType; #ifndef _List_H #define _List_H struct Node; struct ListRecord; typedef struct ListRecord *VariantList; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; VariantList createVariantList(); void MakeEmpty(VariantList varList); int IsEmpty(VariantList varList); int IsLast(Position P, VariantList varList); Position Find(ElementType X, VariantList varList); void Delete(ElementType X, VariantList varList); Position FindPrevious(ElementType X, VariantList varList); void Insert(ElementType X, VariantList varList, Position P); void DeleteVariantList(VariantList varList); Position Header(VariantList varList); Position First(VariantList varList); Position Advance(Position P); ElementType Retrieve(Position P); void InsertFront(ElementType X, VariantList varList); void InsertBack(ElementType X, VariantList varList); #endif
#include"list.h" #include"fatal.h" struct ListRecord { List L; PtrToNode Last; }; struct Node { ElementType Element; Position Next; }; static void DeleteList(List L) { Position p; p = L->Next; L->Next = NULL; while (p != NULL) { Position tmp; tmp = p->Next; free(p); p = tmp; } } VariantList createVariantList() { VariantList varList = malloc(sizeof(struct ListRecord)); varList->L = malloc(sizeof(struct Node)); if (varList->L == NULL) Error("out of memory"); varList->L->Next = NULL; varList->Last = varList->L; return varList; } void MakeEmpty(VariantList varList) { if (varList->L != NULL) DeleteList(varList->L); varList->Last = varList->L; } int IsEmpty(VariantList varList) { return varList->L->Next == NULL; } int IsLast(Position P, VariantList varList) { return P == varList->Last; } Position Find(ElementType X, VariantList varList) { Position P; P = varList->L->Next; while (P != NULL && P->Element != X) { P = P->Next; } return P; } void Delete(ElementType X, VariantList varList) { Position P; P = FindPrevious(X, varList); if (!IsLast(P, varList)) { Position TmpCell = P->Next; if (IsLast(TmpCell,varList)) varList->Last = P; P->Next = TmpCell->Next; free(TmpCell); } } Position FindPrevious(ElementType X, VariantList varList) { Position P; P = varList->L; while (P->Next != NULL&&P->Next->Element != X) P = P->Next; return P; } void Insert(ElementType X, VariantList varList, Position P) { Position tmpCell; tmpCell = malloc(sizeof(struct Node)); if (tmpCell == NULL) FatalError("Out of space!!"); tmpCell->Element = X; tmpCell->Next = P->Next; if (IsLast(P,varList)) varList->Last = tmpCell; P->Next = tmpCell; } void DeleteVariantList(VariantList varList) { MakeEmpty(varList); free(varList->L); free(varList); } Position Header(VariantList varList) { return varList->L; } Position First(VariantList varList) { return varList->L->Next; } Position Advance(Position P) { return P->Next; } ElementType Retrieve(Position P) { return P->Element; } void InsertFront(ElementType X, VariantList varList) { Insert(X, varList, varList->L); } void InsertBack(ElementType X, VariantList varList) { if (IsEmpty(varList)) { Insert(X, varList, varList->L); } else { Insert(X, varList, varList->Last); } }
#include"list.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[]) { VariantList bucket[BUCKETS]; int i, j, k; for (i = 0; i < BUCKETS; i++) { bucket[i] = createVariantList(); } 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) DeleteVariantList(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"); }