一、基序排序的的基本思路
将整数分别从低位到高位进行排序,即先按照个位进行排序、再按照十位进行排序、再百位、千位、、、、、、、、
二、动态演变过程:
以{179,208,306,93,859,984,55,9,271,33};这个数组为例:
三、代码和测试结果
#include <iostream>
#include <list>
using namespace std;
#define DATA_NUM (10)
//获取一个数是几位数:11是2位数,111是3位数....
size_t get_digits(const size_t & num)
{
size_t d = 1, p = 10;
while (num >= p)
{
d++;
p *= 10;
}
return d;
}
//基数排序
void radix_sort(size_t data[], size_t n)
{
size_t max_digit = 0;
for (size_t i = 0; i < n; i++)
{
size_t digit = get_digits(data[i]);
max_digit = max_digit >= digit ? max_digit : digit; //获取最大位数
}
cout << "max_digit:" << max_digit << endl;
size_t d, j, k, factor;
list<size_t> list_arry[DATA_NUM]; //这是个list数组
for (d = 0,factor = 1; d < max_digit; d++,factor *= 10) //最大是几位数就循环几次
{
for (j = 0; j < n; j++)
{
list_arry[(data[j] / factor) % 10].push_back(data[j]); //将数据放到合适的桶位里
}
for (j = k = 0; j < DATA_NUM; j++) //将桶位中的数据放回到原来的数组当中
{
while (!list_arry[j].empty())
{
data[k++] = list_arry[j].front(); //将list中的数据放回到数组中
list_arry[j].pop_front(); //删除掉
}
}
for (size_t m = 0; m < n; m++)
cout << data[m] << " ";
cout << endl;
}
}
int main()
{
size_t data[DATA_NUM] = {179,208,306,93,859,984,55,9,271,33};
radix_sort(data, DATA_NUM);
return 0;
}