/* 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