基数排序

/* FUNCTION_BEG *****************************************************
   函数名:	TRadixSort
   功能:	基数排序
   算法: 
   实现:	Snight Q:51171107
   FUNCTION_END  ******************************************************/
#ifndef H_RADIXSORT_H
#define H_RADIXSORT_H

/* 正序 */
template <class T>
int TRadixSortP(T* apArray, unsigned long aulSize, int aiMaxMedian);

/* 逆序 */
template <class T>
int TRadixSortR(T* apArray, unsigned long aulSize, int aiMaxMedian);

/****** Achieve ******/
template <class T>
int TRadixSortP(T* apArray, unsigned long aulSize, int aiMaxMedian)
{
	T* lpStrArray		= new T[aulSize*10];	// 桶
	int lszACnt[10]		= {0};					// 桶内数据个数计数
	int liBase			= 1;					// 底数
	int	liszAPos		= 0;
	int liTemp			= 0;
	for (int i = 1; i<= aiMaxMedian; ++i)
	{
		liTemp = i;
		while (liTemp--) liBase*=10;
		memset(lpStrArray, 0, sizeof(T)*(aulSize*10));
		memset(lszACnt,0,sizeof(int)*10);
		for (unsigned long i = 0; i < aulSize; ++i)
		{
			switch( (apArray[i] % liBase) / (liBase/10))
			{
			case 0:
				lpStrArray[0*10 + lszACnt[0]++] = apArray[i];
				break;
			case 1:
				lpStrArray[1*10 + lszACnt[1]++] = apArray[i];
				break;
			case 2:
				lpStrArray[2*10 + lszACnt[2]++] = apArray[i];
				break;
			case 3:
				lpStrArray[3*10 + lszACnt[3]++] = apArray[i];
				break;
			case 4:
				lpStrArray[4*10 + lszACnt[4]++] = apArray[i];
				break;
			case 5:
				lpStrArray[5*10 + lszACnt[5]++] = apArray[i];
				break;
			case 6:
				lpStrArray[6*10 + lszACnt[6]++] = apArray[i];
				break;
			case 7:
				lpStrArray[7*10 + lszACnt[7]++] = apArray[i];
				break;
			case 8:
				lpStrArray[8*10 + lszACnt[8]++] = apArray[i];
				break;
			case 9:
				lpStrArray[9*10 + lszACnt[9]++] = apArray[i];
				break;
			}
		}

		for (int i = 0; i < 10; ++i)
		{
			for (int j = 0; j< lszACnt[i]; ++j)
			{
				apArray[liszAPos++] = lpStrArray[i*10 +j];
			}
		}
		memset(lpStrArray, 0, sizeof(T)*(aulSize*10));
		memset(lszACnt,0,sizeof(int)*10);
		liszAPos = 0;
		liBase = 1;

	}
	delete [] lpStrArray;
	lpStrArray = NULL;
	return 1;
}

template <class T>
int TRadixSortR(T* apArray, unsigned long aulSize, int aiMaxMedian)
{
	T* lpStrArray		= new T[aulSize*10];	// 桶
	int lszACnt[10]		= {0};					// 桶内数据个数计数
	int liBase			= 1;					// 底数
	int	liszAPos		= 0;
	int liTemp			= 0;
	for (int i = 1; i<= aiMaxMedian; ++i)
	{
		liTemp = i;
		while (liTemp--) liBase*=10;
		memset(lpStrArray, 0, sizeof(T)*(aulSize*10));
		memset(lszACnt,0,sizeof(int)*10);
		for (unsigned long i = 0; i < aulSize; ++i)
		{
			switch( (apArray[i] % liBase) / (liBase/10))
			{
			case 0:
				lpStrArray[0*10 + lszACnt[0]++] = apArray[i];
				break;
			case 1:
				lpStrArray[1*10 + lszACnt[1]++] = apArray[i];
				break;
			case 2:
				lpStrArray[2*10 + lszACnt[2]++] = apArray[i];
				break;
			case 3:
				lpStrArray[3*10 + lszACnt[3]++] = apArray[i];
				break;
			case 4:
				lpStrArray[4*10 + lszACnt[4]++] = apArray[i];
				break;
			case 5:
				lpStrArray[5*10 + lszACnt[5]++] = apArray[i];
				break;
			case 6:
				lpStrArray[6*10 + lszACnt[6]++] = apArray[i];
				break;
			case 7:
				lpStrArray[7*10 + lszACnt[7]++] = apArray[i];
				break;
			case 8:
				lpStrArray[8*10 + lszACnt[8]++] = apArray[i];
				break;
			case 9:
				lpStrArray[9*10 + lszACnt[9]++] = apArray[i];
				break;
			}
		}

		for (int i = 9; i >= 0; --i)
		{
			for (int j = 0; j <  lszACnt[i]; ++j)
			{
				apArray[liszAPos++] = lpStrArray[i*10 +j];
			}
		}
		memset(lpStrArray, 0, sizeof(T)*(aulSize*10));
		memset(lszACnt,0,sizeof(int)*10);
		liszAPos = 0;
		liBase = 1;

	}
	delete [] lpStrArray;
	lpStrArray = NULL;
	return 1;
}

#endif//H_RADIXSORT_H


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值