基数排序思想是对序列中的每个元素从个位到最大值的最高位进行比较,不足位数的用0补足,当排序结束后,可得有序序列。
和计数排序有些类似,计数排序是对序列中的元素进行计数,而基数排序则是对每位上的数进行记录(实则是在排序),并且这两个排序均是没有发生比较的情况下完成的排序~~~~尤其觉得基数排序神奇。
在基数排序中,我们需要10个代表0-9的数组,用来保存该位出现0-9中的元素,可以把这10个数组看做桶。
无形中的比较:
例如:123和56
在基数排序中,从个位开始把数据进桶:
在开始时,由于123的个位3比56的个位6小,所以放置位置如下:
再对他们的十位上进行比较:
由于最大值的最高位到达百位,所以还需继续比较,而56不足3位,则用0补足
完成排序!
参考代码:
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<array>
#include<time.h>
using namespace std;
const int c_n = 10;
//10个桶,编号为0-9,从个位开始,按照每位上的大小进行排序
//不足的以0补
int cifang(int num) //求10的n次方
{
if (num == 0)
return 1;
else if (num == 1)
return 10;
else
return cifang(num - 1) * 10;
}
void radixSort(int *a)
{
int max = 0;
array<vector<int>, c_n>Bucket; //桶
for (int i = 0; i < c_n; i++) //找到最大值,循环次数是最大数的位数
{
if (a[i] > max)
max = a[i];
}
int temp = max;
int len = 0;
while (temp) //最大值的位数,即循环次数
{
temp /= 10;
len++;
}
int j;
temp = 0;
while (temp<len)
{
j = 0;
for (int i = 0; i < c_n; i++)
{
int c = cifang(temp);
c = a[i] / c;
Bucket[c % 10].push_back(a[i]); //按照位上的值进桶
}
for (int i = 0; i < c_n; i++)
{
auto begin = Bucket[i].begin();
auto end = Bucket[i].end();
if (!Bucket[i].empty())
{
while (begin != end)
{
a[j++] = *begin; //把数据写入序列
end++;
}
while (!Bucket[i].empty()) //清除数据,重新插入
{
Bucket[i].pop_back();
}
}
}
temp++;
}
}
void main()
{
srand(time(NULL));
int a[c_n];
for (int i = 0; i < c_n;i++)
{
a[i] = rand() % 300;
}
radixSort(a);
for (int i = 0; i < c_n; i++)
cout << a[i] << " ";
cout << "\n";
system("pause");
}