概述
Java中排序算法是非常重要的一部分,这里简单分析下基数排序(桶排序)的实现思路及其代码实现。
常见排序算法时间复杂度表
排序算法 | 平均时间复杂度 | 最差情形 | 稳定度 | 额外空间 | 备注 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n^2) | 稳定 | O(1) | n小时较好 |
插入排序 | O(n^2) | O(n^2) | 稳定 | O(1) | n小时较好 |
选择排序 | O(n^2) | O(n^2) | 不稳定 | O(1) | n小时较好 |
快速排序 | O(nlogn) | O(n^2) | 不稳定 | O(nlogn) | n大时较好 |
希尔排序 | O(nlogn) | O(n^s)1 < s < 2 | 不稳定 | O(1) | n大时较好 |
归并排序 | O(nlogn) | O(nlogn) | 稳定 | O(1) | n大时较好 |
堆排序 | O(nlogn) | O(nlogn) | 稳定 | O(1) | n大时较好 |
基数排序 | O(nlogn) | OlogrB | O(n) | O(n) | B为真数(0-9),r为基数个十百 |
基数排序(桶排序)介绍
基数排序(radix sort)属于分配式排序,又称为桶排序。顾名思义,它是通过键值的各个位数的值将要排序的元素分配至某些桶中,达到排序的作用。
基数排序属于稳定性的排序,基数排序是一个效率高的稳定性排序法
基数排序是(Radix sort)是桶排序的扩展
基数排序的基本思想
- 将所有待比较数值统一为同样位数长度,位数较短的数前面补零。然后从最低位开始,依次进行排序。一直从最低位排到最高位后,数列便成为了一个有序的数列了。
基数排序图解
基数排序代码实现(本代码仅支持正整数)
public class RadixSort {
/**
* @param arr 待寻找的数组
* @return 数组中最大位数的长度
*/
public static int findMax(int[] arr) {
if (arr == null || arr.length <= 0) {
throw new IllegalArgumentException();
}
int max = arr[0];
for (int i = 1;i < arr.length;i++) {
if (max < arr[i]) {
max = arr[i];
}
}
int maxLength = ("" + max).length;
return maxLength;
}
/**
* 进行桶排序
* @param arr 待排序的数组
* @param 数组中最大数的位数
*/
public static void radixSort(int[] arr, int maxLength) {
if (arr == null || arr.length <= 0) {
throw new IllegalArgumentException();
}
// 创建10个桶,分别记录数值为(0 - 9)
int[][] bucket = new int[10][arr.length];
// 创建10个数组用来记录每个桶中元素的个数
int[] bucketElementCounts = new int[10];
for (int i = 0,n = 1;i < maxLength;i++,n *= 10) {
for (int j = 0;j < arr.length;i++) {
int digitOfElement= arr[i] / n % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement] ++;
}
int index = 0;
for (int i = 0;i < bucketElementCounts.length;i++) {
if (bucketElementCounts[i] > 0) {
for (int j = 0; j < bucketElementCounts[i];j++) {
arr[index] = bucket[i][j];
index++;
}
bucketElementCounts[i] = 0;
}
}
}
}
}
代码写完,小弟能力有限,仅供参考!!!如有错误欢迎指出。