/**
利用基数排序算法排序数组A=<COW,DOG,SEA,RUG,ROW,MOB,BOX,TAB,EAR,TAR,DIG,BIG,TEA,NOW,FOX>
**/
/****************************************************************************
基数排序核心思想:
将每一个元素拆分按位从低到高来处理,对每一位的处理过程依赖稳定的中间排序算法,
如:计数排序等。其时间复杂度也基于中间排序算法,能在O(n)时间内完成。
****************************************************************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void count_sort(string data[],int size,int d);
void radix_sort(string data[],int size,int d);
int main()
{
string A[15]={"COW","DOG","SEA","RUG","ROW","MOB","BOX","TAB","EAR","TAR","DIG","BIG","TEA","NOW","FOX"};
cout<<"The set of data show as:"<<endl;
for(int i=0;i<15;i++)
{
cout<<A[i]<<"\t";
}
cout<<endl;
//对数据进行排序,从小到大
//显示排序完的数据
cout<<"The set of data after sorting show as:"<<endl;
radix_sort(A,15,3);
system("pause");
return 0;
}
void radix_sort(string data[],int size,int d)
{
for(int i=d-1;i>=0;i--)
{
count_sort(data,size,i);
}
}
//对每一位利用计数排序进行排序
void count_sort(string data[],int size,int d)
{
vector<int> data_b;//记录小于i的元素的个数
for(int i=0;i<26;i++)
data_b.push_back(0);
vector<string> data_c;//保存最终的排序结果
for(int i=0;i<size;i++)
data_c.push_back("");
//统计等于i的元素的个数
for(int i=0;i<size;i++)
{
data_b[data[i][d]-65]++;
}
//统计小于或等于i的元素的个数
for(int i=1;i<26;i++)
{
data_b[i]+=data_b[i-1];
}
//依据data_b的值来排序
for(int i=size-1;i>=0;i--)//保证稳定排序
{
data_c[data_b[data[i][d]-65]-1]=data[i];
data_b[data[i][d]-65]--;
}
cout<<"d="<<d<<endl;
for (int i=0;i<data_c.size();i++)
{
cout<<data_c[i]<<"\t";
data[i]=data_c[i];
}
cout<<endl;
}