数据结构基础7.7:基数排序
2015-11-30 13:16
471 查看
一.定义:
基数排序又称桶排序。基数排序与本系列前面讲解的七种排序方法都不同,它不需要比较关键字的大小。
它是根据关键字中各位的值,通过对排序的N个元素进行若干趟“分配”与“收集”来实现排序的。
二.算法描述(LSD次位优先实现):
基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:1. 分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)。
2. 收集,再将放置在0~9号桶中的数据按顺序放到数组中。
重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)。
三.代码实现(LSD次位优先实现):
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define OK 1 #define ERROR 0 /* 假设元素最多有MaxDigit个关键字,基数全是同样的Radix */ #define MaxDigit 3 #define Radix 10 typedef int Status; typedef struct Node *pNode; typedef struct NodeHead HeadNode; /* 元素结点 */ struct Node { int val; pNode next; }; /* 基数数组的表头结点 */ struct NodeHead { pNode head, tail; }; /* 求v第i位的关键字的值 */ int GetDigit(int val, int d) { int i, n; for(i = 0; i < d; i++) { n = val % Radix; val /= Radix; } return n; } /* 基数排序(次位优先) */ Status LSDRadix_Sort(int a[], int n) { int i, j, d; HeadNode N[Radix]; pNode list = NULL, tmp = NULL, p; for(i = 0; i < Radix; i++) { N[i].head = NULL; } /* list数组初始化 */ for(i = 0; i < n; i++) { if(!(tmp = (pNode)malloc(sizeof(struct Node)))) exit(1); tmp->val = a[i]; tmp->next = list; list = tmp; } /* 一共进行MaxDigit次排序 */ for(i = 1; i < MaxDigit + 1; i++){ /* 分配过程 */ p = list; for(j = 0; j < n; j++) { d = GetDigit(p->val, i); if(N[d].head == NULL) N[d].head = N[d].tail = p; else { N[d].tail->next = p; N[d].tail = p; } p = p->next; } /* 收集过程 */ list = NULL; for(j = Radix - 1; j >= 0; j--) { if(N[j].head != NULL) { N[j].tail->next = list; list = N[j].head; N[j].head = N[j].tail = NULL; } } } /* 最终将排序好的list数组导入到a[]中 */ for(i = 0; i < n; i++) { a[i] = list->val; tmp = list; list = list->next; free(tmp); } } int main() { int i; int a[] = {11, 9, 223, 8, 35, 712, 4, 63, 5, 100}; for(i = 0; i < sizeof(a) / sizeof(a[0]); i++) printf("%d ", a[i]); printf("\n"); LSDRadix_Sort(a, sizeof(a) / sizeof(a[0])); for(i = 0; i < sizeof(a) / sizeof(a[0]); i++) printf("%d ", a[i]); printf("\n"); system("pause"); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法