基数排序(Radix Sort)
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
算法描述
- 取得数组中的最大数,并取得位数;(位数决定轮次)
- arr为原始数组,从最低位开始取每个位组成radix数组;
- 对radix进行计数排序(利用计数排序适用于小范围数的特点);
动图演示
代码实现
非负整数基数排序
- 时间复杂度 O(n * maxLength * 2)
- 空间复杂度 O(10 * n + 10)
本次实现直接给十个桶分配了n的大小,基于数组操作。
小伙伴们可以使用链表或者动态数组代替数组,节省空间。 - 只支持非负整数排序!
/**
* 正数基数排序
* @param array 正数数组
*/
private void positiveRadixSort(int[] array) {
// 数组长度小于2 没必要进行排序(也可以避免后续的异常)
if (array.length < 2) {
return;
}
// 得到数组中最大的数
int maxNum = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > maxNum) {
maxNum = array[i];
}
}
// 得到最大数是几位数
int maxLength = (maxNum + "").length();
// 定义一个二维数组,表示10个桶, 每个桶就是一个一维数组
int[][] bucket = new int[10][array.length];
// 每个桶存入了几个数字
i