排序算法之基数排序

基数排序,利用计数排序思想,对数据分别按位数进行计数排序,时间复杂度O(n·k); 需要 O(n) 额外空间,是稳定的排序

#include<iostream>
using namespace std;
void RadixCountSort(int A[], int k, int len)//分别为需排序的数组,排序的基数,数组的长度
{
	int *C = new int[k]();//计数排序所需临时空间,初始化为0
	int *nDataRadix = new int[len];//储存基数
	int *ntempRadix = new int[len];	//储存每次排序后的数组(计数排序使用)
	int i,RadixBase=1,IsOk;
	while(true)
	{
		IsOk = 1;//排序完成标志位置1
		for(i=0;i<k;i++)//对计数排序的临时空间清0
			C[i]=0;
		for(i=0;i<len;i++)//将当前基数存入nDataRadix数组
		{
			if(IsOk!=0&&A[i]/RadixBase!=0)//当不是所有数据都已判断完成时,标志位置0,当标志位已被置0时不再判断
				IsOk=0;
			nDataRadix[i]=A[i]/RadixBase%10;
		}
		if(IsOk)//标志位为1则退出循环
			break;
		/*对基数进行计数排序,或其他稳定排序*/
		for(i=0;i<len;i++)
			++C[nDataRadix[i]];
		for(i=1;i<k;i++)
			C[i]+=C[i-1];
		for(i=len-1;i>=0;i--)
		{
			--C[nDataRadix[i]];
			ntempRadix[C[nDataRadix[i]]]=A[i];
		}
		for(i=0;i<len;i++)//将按当前基数排好的顺序返回
		{
			A[i]=ntempRadix[i];
		}
		RadixBase*=k;//基数移至下一位
	}
	delete []C;
	delete []nDataRadix;
	delete []ntempRadix;
}


int main()
{
	int nData[10] = {123,5264,9513,854,9639,1985,159,3654,8521,8888};
	RadixCountSort(nData,10,10);
	for (int i = 0; i < 10; ++i)
	{
		cout<<nData[i]<<"--";
	}
	cout<<endl;
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值