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

[数据结构]Radix_sort(MSD)

2016-04-30 22:13 465 查看
//.h
#include<queue>
#include"Linked_list.h"
#include"Record.h"
const int max_char = 28;				//分为28组,一组用于放置空,一组用于放置非法字符

class Sortable_list:public List<Record>
{
public:
void radix_sort();

private:
void rethread(queue<Record> queues);		//合并函数
void sort(queue<Record> &queues,int deep);				//分桶函数
};

int alphabetic_order(char c);				//辅助函数
//.cpp
#include "Radix_sort.h"
#include<iostream>
using namespace std;
int alphabetic_order(char c)
{
if (c == ' ' || c == '\0') return 0;
if (c >= 'a'&&c <= 'z')return (c - 'a' + 1);
if (c >= 'A'&&c <= 'Z')return (c - 'A' + 1);
return 27;
}

void Sortable_list::radix_sort()
{
Record data;
queue<Record> queues;
while(remove(0,data)==success){
queues.push(data);
}
sort(queues, key_size);
}

void Sortable_list::rethread(queue<Record> queues)
{
Record x;
while (!queues.empty()) {
x = queues.front();
insert(size(), x);
queues.pop();
}
}

void Sortable_list::sort(queue<Record> &queues,int deep)
{
Record data;
queue<Record>recur_queues[max_char];
unsigned int size = queues.size();
for (unsigned int i = 0; i < size; i++) {
data = queues.front();
queues.pop();
int queue_order = alphabetic_order(data.key_letter(key_size-deep));
recur_queues[queue_order].push(data);
}
//递归调用
for (int i = 0; i < max_char; i++) {
if (deep > 1) sort(recur_queues[i], deep - 1);
}
for (int i = 0; i < max_char; i++)
rethread(recur_queues[i]);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: