//.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]);
}