基本思想
基数排序(radix sort)又称桶排序(bucket sort)。主要用于整数的排序。通过提取整数的各个位的 值,将其存放到对应的桶中,再将各个桶按照顺序,将桶里面的值依次提取出来。进行多次循环,单次循环后数据还是处于无序状态,但是当最后依次循环完成时,数据是有序的。
步骤
- 得到要统计的数据中最大数的位数,作为循环的次数i
- 从要排序的数据中取出一个数据
- 提取出该值的当前位的值,将其分类到指定的桶中。以十进制为例,提取数据的个位/百位/千位…将数据分类到0-9这10个桶中
- 遍历所有要排序的数据,将所有的数据分类到对应的桶中
- 将所有的桶中的数据按顺序存放到一个大桶中
- 重复步骤2-5,直到执行i次循环
时间复杂度分析
最外层循环的次数取决于要排序的数据的最大值的位数,假设按照十进制的方式将数据分到十个桶中,则:
i=log10maxi=\log_{10}{max}i=log10max
其中maxmaxmax为要排序数据的最大值。
每次循环需要遍历所有的数据,因此该排序算法的时间复杂度为:
O(nlogmmax)O(n\log_{m}{max})O(nlogmmax)
当使用十个桶进行排序时,时间复杂度为
O(nlog10max)O(n\log_{10}{max})O(nlog10max)
C++实现
int maxB(vector<int>::iterator b, vector<int>::iterator e) {
int max = *b;
while (b != e) {
if (max < *b) {
max = *b;
}
b++;
}
int i = 0;
while (max > 0) {
i++;
max /= 10;
}
return i;
}
vector<int> RadixSort(vector<int>::iterator b, vector<int>::iterator e) {
list<int> l[10];
int max = maxB(b, e);
int p = 1;
vector<int> re;
for (int i = 1; i <= max; i++) {
p *= 10;
vector<int>::iterator cb = b, ce = e;
while (cb != ce) {
int t = (*cb) % p / (p / 10);
l[t].push_back(*cb);
cb++;
}
/*for (int i = 0; i < 10; i++) {
for (auto a = l[i].begin(); a != l[i].end(); a++) {
cout << *a << " ";
}
}
cout << endl;*/
re.clear();
for (int i = 0; i < 10; i++) {
for (auto a = l[i].begin(); a != l[i].end(); a++) {
re.push_back(*a);
}
l[i].clear();
}
/*for (auto i = re.begin(); i != re.end(); i++) {
cout << *i << " ";
}
cout << endl;*/
b = re.begin();
e = re.end();
}
return re;
}