基数排序
Posted Lune-Qiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序相关的知识,希望对你有一定的参考价值。
基数排序:最稳定的排序。 第二个基于非比较的排序。第一个是计数排序
LSD:低位优先
MSD : 高位优先
接下来说的是LSD低位优先
思路:按位建立哈希表,从低位开始
由于每一位都有0~9的阿拉伯数字构成。所以我们可以申请固定的空间
根据个位建立哈希表,再按照顺序放回原数组
根据十位建立哈希表,再按照顺序放回原数组
根据百位建立哈希表,再按照顺序放回原数组
。。。。
需要注意的是,哈希表的添加为尾添加,且必须按照原数组顺序。
代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 typedef struct node1 5 { 6 int num; 7 struct node1* pnext; 8 }Node; 9 10 void RadixSort(int* arr,int len) 11 { 12 //找到最高位,决定我们要建立几次哈希表 13 int Max = arr[0]; 14 for(int i = 0; i < len;i++) 15 { 16 if(Max < arr[i]) 17 Max = arr[i]; 18 } 19 20 int n = 10; 21 while(Max/n) 22 { 23 n *=10; 24 } 25 Node** Radix = (Node**)malloc(sizeof(Node*)*10); 26 memset(Radix,0,sizeof(Node*)*10); 27 for(int i = 1; i < n;i*=10) 28 { 29 //建立哈希表 30 for(int j = 0; j < len;j++) 31 { 32 Node* node = (Node*)malloc(sizeof(Node)); 33 node->num = arr[j]; 34 node->pnext = NULL; 35 int index = arr[j]/i%10;//求得每一位上的数 36 //建立哈希表进行尾添加 37 if(Radix[index]) 38 { 39 Node* tmp = Radix[index]; 40 while(tmp->pnext != NULL) 41 { 42 tmp = tmp->pnext; 43 } 44 tmp->pnext = node; 45 } 46 else 47 Radix[index] = node; 48 } 49 int id = 0; 50 Node* pDel; 51 //放回原数组并删除原链表的节点 52 for(int i = 0; i < 10;i++) 53 { 54 while(Radix[i]) 55 { 56 arr[id++] = Radix[i]->num; 57 pDel = Radix[i]; 58 Radix[i] = Radix[i]->pnext; 59 free(pDel); 60 pDel = NULL; 61 } 62 } 63 } 64 free(Radix); 65 Radix = NULL; 66 } 67 int main() 68 { 69 int arr[] = {322,15,45,3,78,987,54,0,5,14}; 70 int len = sizeof(arr)/sizeof(arr[0]); 71 72 RadixSort(arr,len); 73 for(int i = 0; i < len;i++) 74 printf("%d ",arr[i]); 75 }
以上是关于基数排序的主要内容,如果未能解决你的问题,请参考以下文章