java排序之基数排序
基数排序又称为桶排序,根据桶去排序的.可以这么认为,我有5个桶,分别是1,2,3,4,5,然后我有一堆数字,123,234,345,然后根据除数或余数去放到相对应的桶里面
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class radixSort {
public static void main(String[] args) throws IOException {
int arr[]=GetData(20);
System.out.println("preSort:"+ Arrays.toString(arr));
radixSortNum(arr);
System.out.println("Sorted:"+ Arrays.toString(arr));
}
//基数排序
private static void radixSortNum(int[] arr) {
int digit=getMaxDigit(arr); //获取最大的数是多少位数
for (int i=0;i<digit;i++){ //进行最大的数的位数的排序次数
bucketSort(arr,i);
}
}
//桶排序
private static void bucketSort(int[] arr, int digit) {
int base= (int) Math.pow(10,digit);
//初始化桶
ArrayList<ArrayList<Integer>> buckets=new ArrayList<>();
// 只有0~9这十个数,所以准备十个桶
for(int i=0;i<10;i++){
buckets.add(new ArrayList<>());
}
//进行排序,从右往左比较大小
for (int i:arr){
int index=i / base % 10;
buckets.get(index).add(i);
}
//排完序后,再返回数组
int index=0;
for (ArrayList<Integer> bucket:buckets){
for (int i:bucket){
arr[index++]=i;
}
}
}
//获取最大数的位数
private static int getMaxDigit(int[] arr) {
int digit=1; //默认一位数
int base=10; //十进制
for (int i:arr){ //遍历数组
while(i>base){ //当数小于10,则进位且乘10
digit++;
base*=10;
}
}
return digit;
}
//读取datafile.txt内容
public static int[] GetData(int num) throws FileNotFoundException {
Scanner in=new Scanner(new FileInputStream("D:\\download\\eclipse\\JavaSE1.8Text\\src\\Day_1\\datafile.txt"));//获取
String str=in.next();
String [] split=str.split(",");//按,分隔
int[] nums=new int[num];
for (int i = 0; i < num; i++) {
nums[i]=Integer.parseInt(split[i]);//将获取的数据转化为整形
}
return nums;
}
}