博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单链表实现基数排序
阅读量:6412 次
发布时间:2019-06-23

本文共 4544 字,大约阅读时间需要 15 分钟。

基数排序是通过“分配”和“收集”过程来实现排序

(1)假设有欲排数据序列如下所示:

73  22  93  43  55  14  28  65  39  81

首先根据个位数的数值,在遍历数据时将它们各自分配到编号0至9的桶(个位数值与桶号一一对应)中。

分配结果(逻辑想象)如下图所示:

分配结束后。接下来将所有桶中所盛数据按照桶号由小到大(桶中由顶至底)依次重新收集串起来,得到如下仍然无序的数据序列:

81  22  73  93  43  14  55  65  28  39

接着,再进行一次分配,这次根据十位数值来分配(原理同上),分配结果(逻辑想象)如下图所示:

分配结束后。接下来再将所有桶中所盛的数据(原理同上)依次重新收集串接起来,得到如下的数据序列:

14  22  28  39  43  55  65  73  81  93

观察可以看到,此时原无序数据序列已经排序完毕。如果排序的数据序列有三位数以上的数据,则重复进行以上的动作直至最高位数为止。

代码 (C语言实现)

1 #ifndef __SINGLY_LINKED_LIST_H__  2 #define __SINGLY_LINKED_LIST_H__  3   4 typedef int ElementType;  5 struct Node;  6 typedef struct Node* PtrToNode;  7 typedef PtrToNode List;  8 typedef PtrToNode Position;  9  10 struct Node 11 { 12     ElementType Val; 13     Position Next; 14 }; 15 void  CreateList(List*); 16 void  DeleteList(List); 17 int  IsEmpty(List); 18 int  IsLast(Position, List); 19 Position  Header(List); 20 Position  First(List); 21 Position  Advance(Position); 22 Position  Find(ElementType, List); 23 ElementType  GetAt(Position); 24 void  MakeEmpty(List); 25 void  Delete(ElementType, List); 26 void  Insert(ElementType, Position, List); 27 void  InsertFront(ElementType, List); 28 void  InsertBack(ElementType, List); 29  30 #endif 31 void  CreateList(List* L) 32 { 33     PtrToNode pHeader = (struct Node*)malloc(sizeof(struct Node)); 34     pHeader->Next = NULL; 35     *L = pHeader; 36 } 37  38 void  DeleteList(List L) 39 { 40     MakeEmpty(L); 41     free(L); 42 } 43  44 int  IsEmpty(List L) 45 { 46     return L->Next == NULL; 47 } 48  49 int  IsLast(Position P, List L) 50 { 51     return P->Next == NULL; 52 } 53  54 Position  Header(List L) 55 { 56     return L; 57 } 58  59 Position  First(List L) 60 { 61     return L->Next; 62 } 63  64 Position  Advance(Position P) 65 { 66     return P->Next; 67 } 68  69 Position  Find(ElementType X, List L) 70 { 71     Position p = L->Next; 72     while(p != NULL && p->Val != X) 73     { 74         p = p->Next; 75     } 76     return p; 77 } 78  79 ElementType  GetAt(Position P) 80 { 81     return P->Val; 82 } 83  84 void MakeEmpty(List L) 85 { 86     Position p, tmp; 87     p = L->Next; 88     while(p != NULL) 89     { 90         tmp = p->Next; 91         free(p); 92         p = NULL; 93         p = tmp; 94     } 95     L->Next = NULL; 96 } 97  98 void  Delete(ElementType X, List L) 99 {100     Position p, tmp;101     p = L;102     while(p->Next != NULL && p->Next->Val != X)103     {104         p = p->Next;105     }106     if(!IsLast(p, L))107     {108         tmp = p->Next;109         p->Next = tmp->Next;110         free(tmp);111         tmp = NULL;112         // 错误示范:113         //free(p->Next);114         //p->Next = tmp->Next;115     }116 }117 118 void  Insert(ElementType X, Position P, List L)119 {120     PtrToNode pNode;121     pNode = (struct Node*)malloc(sizeof(struct Node));122     pNode->Val = X;123     pNode->Next = P->Next;124     P->Next = pNode;125 }126 127 void  InsertFront(ElementType X, List L)128 {129     Position pos;130     PtrToNode pNode;131     pos = L;132     pNode = (struct Node*)malloc(sizeof(struct Node));133     pNode->Val = X;134     pNode->Next = pos->Next;135     pos->Next = pNode;136 }137 138 void  InsertBack(ElementType X, List L)139 {140     Position pos;141     PtrToNode pNode;142     // move to tail143     pos = L;144     while(pos->Next != NULL)145         pos = pos->Next;146     pNode = (struct Node*)malloc(sizeof(struct Node));147     pNode->Val = X;148     pNode->Next = pos->Next;149     pos->Next = pNode;150 }

 

1 #include 
2 #include
3 #include "SinglyLinkedList.h" 4 5 #define N 10 // 排序的数个数 6 #define B 10 // 桶数,即基数 7 #define P 3 // 位数 8 9 void RadixSort(int arr[]);10 int GetDigit(int x, int y);11 void PrintArray(int arr[], int size);12 13 int main()14 {15 int i;16 //int arr[N];17 int arr[N] = {
64, 8, 216, 512, 27, 729, 0, 1, 343, 125}; // 10, 318 //int arr[N] = {64, 8, 216, 512, 125, 729, 0, 729, 343, 125};19 //int arr[N] = {12, 58, 37, 64, 52, 36, 99, 63, 18, 9, 20, 88, 47}; // 13, 220 21 printf("before sort: ");22 PrintArray(arr, N);23 24 RadixSort(arr);25 26 printf("after sort: ");27 PrintArray(arr, N);28 29 system("PAUSE");30 return 0;31 }32 33 void RadixSort(int arr[])34 {35 int i, j, k, digit;36 Position pos;37 List bucket[B];38 39 // 创建桶40 for(i=0; i
Val;60 pos = pos->Next;61 }62 }63 }64 65 for(i=0; i

 

 

 

转载于:https://www.cnblogs.com/xjtuchenpeng/p/4979253.html

你可能感兴趣的文章
Win7 64bit 安装Mysql5 出错 无法启动服务。
查看>>
嵌入式 H264参数语法文档: SPS、PPS、IDR以及NALU编码规律
查看>>
初识Opserver,StackExchange的监控解决方案
查看>>
给大家讲解一下JavaScript与后台Java天衣无缝相结合
查看>>
探索HTML5之本地文件系统API - File System API
查看>>
javascript有用代码块(1)
查看>>
libevent 笔记
查看>>
PHP实现人人OAuth登录和API调用
查看>>
redis源码笔记 - initServer
查看>>
FindBugs工具常见问题
查看>>
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>
java多线程系列5-死锁与线程间通信
查看>>
数据库分库分表
查看>>
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
linux包之diff
查看>>
spring事务学习(转账案例)(二)
查看>>