您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息