基数排序

/**
利用基数排序算法排序数组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;
}

 

点赞