#include <iostream>
using namespace std;
void RadixSort(int* A, int startIndex, int endIndex, int digit);
int GetDigit(int data, int digit);
int main ()
{
int arr[] = {3,1,5,2,4,55,3,1,9,8,99,4,99,100,120,8,7};
int len = sizeof(arr)/sizeof(arr[0]);
RadixSort(arr, 0, len-1, 3);
for (int i = 0; i < len; ++i)
{
cout << arr[i] << "\t";
}
cout << endl;
return 0;
}
int GetDigit(int data, int digit)
{
int a[] = {1,1,10,100};
return (data / a[digit]) % 10;
}
void RadixSort(int* A, int startIndex, int endIndex, int digit)
{
//0-9共10个桶
const int radix = 10;
//桶元素计数队列
int* pCount = new int[radix];
//辅助桶
int* pBucket = new int[endIndex - startIndex + 1];
for (int d = 1; d <= digit; ++d)
{
//置空各个桶的计数
for (int i = 0; i < radix; ++i)
{
pCount[i] = 0;
}
//统计各个桶将要装入的数据个数
for (int i = startIndex; i <= endIndex; ++i)
{
int bucketId = GetDigit(A[i], d);
pCount[bucketId] += 1;
}
//累加,得到各个桶的右边界索引
for (int i = 1; i < radix; ++i)
{
pCount[i] += pCount[i-1];
}
//将数据依次装入桶中
for (int i = endIndex; i >= startIndex; --i)
{
int bucketId = GetDigit(A[i], d);
pBucket[ pCount[bucketId] - 1 ] = A[i];
pCount[bucketId] -= 1;
}
//依次从桶中取出数据,放入原数组
for (int i = startIndex; i <= endIndex; ++i)
{
A[i] = pBucket[i];
}
}
delete pBucket;
pBucket = NULL;
delete pCount;
pCount = NULL;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交