基数排序
算法概述:
基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。
算法过程:
取得数组中的最大数,并取得位数;
arr为原始数组,从最低位开始取每个位组成radix数组;
对radix进行计数排序(利用计数排序适用于小范围数的特点)
时间复杂度:
T(n) = O(n * k) 最差情况:T(n) = O(n * k) 平均情况:T(n) = O(n * k)
代码:
public class Test18 {
public static void main(String[] args) {
int[] array = {2,1,5,3,5,13,9,12,1};
//获得数组中最大的位数
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i]>max) {
max =array[i];
}
}
int Digit = 0;
while(max%10>0){
Digit++;
max = max/10;
}
//排序
sort(array,Digit,1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
public static void sort(int[] array,int Digit,int DigitIndex){
//如果要排的位数大于最大位数则退出
if (DigitIndex>Digit) {
return;
}
//要排序的位数
int divisor = 1;
int j = DigitIndex;
while(j>0){
divisor = divisor*10;
j--;
}
//初始化临时数组
List[] listArray= new List[10];
for(int i = 0;i<listArray.length;i++){
listArray[i] = new ArrayList<Integer>();
}
//根据知道的位数的大小对原数组放入到临时数组进入的下标的集合中
for (int i = 0; i < array.length; i++) {
if (divisor==10) {
listArray[array[i]%divisor].add(array[i]);
}else{
listArray[array[i]/(divisor/10)].add(array[i]);
}
}
//将临时数组中的元素按顺序放回到原数组中
int index =0;
for (int i = 0; i < listArray.length; i++) {
ArrayList<Integer> arrayList = (ArrayList<Integer>) listArray[i];
for (Integer integer : arrayList) {
array[index++] = integer;
}
}
//根据一个位数对数组进行再次排序
sort(array,Digit,++DigitIndex);
}
}