代码如下:
// 思想:// 使用了桶排序中桶的思想,但它比桶排序更精明,它只需要十个桶,因为他的排序思想是分别对元素中 // 的个位,十位,百位....进行排序.// 也就是说,首先对所有数以个位数的大小进行排序,然后再对所有数以他们的十位数进行排序,依次类推.// 在整个过程中会使得原始序列逐渐趋近有序,待将最高位排完之后完全有序.// 想想为什么是从个位开始而不是从最高位开始呢,按道理从最高位开始的话每次都能得出一部分数的正确大小关系.// 确实可以从最高位开始,而且可以减少比较次数,但是从最高位开始会有一个致命缺点,那就是在如果从高位开始,在对高位相同的// 数继续排序时,又需要另外创建十个桶对他们排序,其实也就是说最终的结果就是真多每一个不同的元素都会为它创建一个桶,// 如果待排序序列有10000个不同的元素,那么从高位开始比较的方法就需要创建10000个桶,而从个位开始比较的方法可以重复使用// 那10个桶,如果序列个数更多那么这样的性能差异就更明显,所以虽然减少了比较次数但浪费了非常多的空间,得不偿失.// 所以我们说基数排序的话都默认的是从个位开始比较的.#include <iostream>
#include <cmath>
#include <list>
using namespace std;void RadixSort(int *a, int len)
{int max = a[0];//遍历待排序序列获取最大值for (int i = 1; i < len; i++)if (a[i] > max) max = a[i];//计算最大值位数int digits = 1;while (max / 10 > 0){digits++;max /= 10;}//创建10个桶,因为需要频繁地往桶里面插入元素,所以我们使用list容器list<int>bucket_list[10];for (int i = 1; i <= digits; i++){for (int j = 0; j < len; j++){int radix = static_cast<int>(a[j] / pow(10, i - 1)) % 10;bucket_list[radix].push_back(a[j]);}//每完成一轮便要将桶里的元素按顺序合并到原序列int k = 0;for (int n = 0; n < 10; n++){for (auto value : bucket_list[n]){a[k++] = value;}bucket_list[n].clear();}}
}int main()
{int a[] = { 12,314,14,234,32,511,32,412,5,3575 };RadixSort(a, 10);for (int i = 0; i < 10; i++) cout << a[i] << " ";cout << endl;return 0;
}