码迷,mamicode.com
首页 > 编程语言 > 详细

基数排序

时间:2018-06-06 15:19:44      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:nbsp   哈希   node   oid   基数排序   i++   eof   []   ems   

基数排序:最稳定的排序。 第二个基于非比较的排序。第一个是计数排序

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 }

 

基数排序

标签:nbsp   哈希   node   oid   基数排序   i++   eof   []   ems   

原文地址:https://www.cnblogs.com/Lune-Qiu/p/9144499.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!