概述
基数排序:
思想:
- 可以理解为位数多的数一定比位数少的数大,同样位数的数最高位越大,数就越大。
- 每一遍排出来的是位数上按大小的排列
图示
代码
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class radixSort {
/*
* 基数排序
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr1[] = { 53, 3, 542, 748, 14, 214 };
radix(arr1);
System.out.println(Arrays.toString(arr1));
// 效率测试
int[] arr = new int[30000000];
for (int i = 0; i < 30000000; i++) {
arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
}
Date data1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat.format(data1);
System.out.println("排序前的时间是=" + date1Str);
// 测试冒泡排序
radix(arr);
Date data2 = new Date();
String date2Str = simpleDateFormat.format(data2);
System.out.println("排序后的时间是=" + date2Str);
}
// 实现基数排序
public static void radix(int[] arr) {
int[][] arr1=new int [10][arr.length];
int[] countArr=new int[10];
int maxSize=arr[0];
for(int i=1;i<arr.length;i++) {
if(arr[i]>maxSize) {
maxSize=arr[i];
}
}
maxSize=(""+maxSize).length();
for(int i=1,n=1;i<=maxSize;i++) {
for(int j=0;j<arr.length;j++) {
int a=arr[j]/n%10;
arr1[a][countArr[a]]=arr[j];
countArr[a]++;
}
int index=0;
for(int j=0;j<countArr.length;j++) {
int a=0;
while (countArr[j]>0) {
arr[index]=arr1[j][a];
a++;
index++;
countArr[j]--;
}
}
}
}
}