原理请看其他文章,这里只做代码的简单分析
#include<iostream>
using namespace std;
//求最大位数
int max_bit(int arr[], int len)
{
int max = arr[0];
for (int i = 0; i < len; i++)
{
if (arr[i] > max)
max = arr[i];
}
int bit = 0;
while (max > 0)
{
bit++;
max /= 10;
}
return bit;
}
void radix_sort(int arr[], int len)
{
int* count = new int[10]; //计数器
int* temp = new int[len]; //临时数组
int bit = max_bit(arr, len); //得到数组的最大位数
int radix = 1;
for (int i = 0; i < bit; i++) //基数排序:有多少位执行多少次就ok了
{
//每次排序之前都要清空
memset(count, 0, 10 * sizeof(int));
//对基数进行计数
for (int j = 0; j < len; j++)
count[(arr[j] / radix)%10]++;
for (int j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j];
//这里的计数器记录的不能只是一个基数的数量,还要知道这个基数前面有多少个其他基数数量
//因为后面用到的是对基数进行排序
//这里为什么要从len-1开始?
//目的是从十位开始,由于已经按照前一个低位排序好 此时数组 例如 17,19
//此时如果从j=0开始,那么17会被排序到后面,19会被排序到前面,看代码 count[k]-- 就知道为什么了
for (int j = len-1; j >=0; j--)
{
int k = (arr[j] / radix) % 10;
temp[count[k] - 1] = arr[j]; //按照基数排序并放入临时数组
count[k]--;
}
//把临时数组的元素赋值到目标数组
for (int j = 0; j < len; j++)
arr[j] = temp[j];
radix *= 10;
}
delete[] temp;
delete[] count;
}
int main(){
int a[] = { 2,9,0,1,100,6,50,2,6,8,16,92 };
radix_sort(a, sizeof(a) / sizeof(int));
for (auto it : a)
{
cout << it << " ";
}
cout << endl;
system("pause");
return 0;
}