算法思想
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
算法描述
1.取得数组中的最大数,并取得位数;
2.arr为原始数组,从最低位开始取每个位组成radix数组;
3.对radix进行计数排序(利用计数排序适用于小范围数的特点);
算法实现
C++
#include<iostream>
using namespace std;
void radixSort(int* arr, int len)
{
//找出最大元素的位数
int digit = 1;
int radix = 10;
for (int i = 0; i < len; ++i)
{
while (arr[i] >= radix)
{
radix = radix * 10;
++digit;
}
}
int* temp = new int[len];
int buckets[10];
int base = 1; //从各位开始
int k;
for (int i = 1; i <= digit; ++i)
{
//buckets初始化
for (int j = 0; j < 10; ++j)
{
buckets[j] = 0;
}
for (int j = 0; j < len; ++j)
{
k = (arr[j] / base) % 10;
buckets[k]++;
}
for (int j = 1; j < 10; ++j)
{
buckets[j] = buckets[j - 1] + buckets[j];
}
for (int j = len-1; j >=0; --j)
{
k = (arr[j] / base) % 10;
temp[buckets[k] - 1] = arr[j];
buckets[k]--;
}
for (int j = 0; j < len; ++j)
{
arr[j] = temp[j];
}
base = base * 10;
}
delete [] temp;
}
int main()
{
//int arr[] = { 10,109,388,309,29,288,400,4,32,3353,543,3997,28,14,26,654,512,223 };
int arr[] = { 13, 24, 54, 12, 66, 123, 564 };
//int arr[] = { 1,3,4,7,46,2,1,4,6,5,7,6 };
int len = sizeof(arr) / sizeof(arr[0]);
radixSort(arr, len);
for (int i = 0; i < len; ++i)
cout << arr[i] << ' ';
return 0;
}