基数排序(桶排序)
是一种稳定的(同样大小的相对位置保持不变),牺牲内存换速度的排序方法。
package com.mycode.bucketsort;
import java.text.SimpleDateFormat;
import java.util.Date;
//基数排序(桶排序)是一种牺牲内存换取速度的方法。
public class BucketSortTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = BucketSortTest.create(880000);
// BucketSortTest.show(arr);
Date date =new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
String dateStr = simpleDateFormat.format(date);
System.out.println("排序前的时间是:" + dateStr);
BucketSortTest.bucketSort(arr);
Date date2 =new Date();
String dateStr2 = simpleDateFormat.format(date2);
System.out.println("排序后的时间是:" + dateStr2);
// BucketSortTest.show(arr);
}
//显示数组
public static void show(int[] arr){
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
//生成一个随机数组
public static int[] create(int n){
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = (int)(Math.random() * 900000);
}
return arr;
}
public static void bucketSort(int[] arr){
//创建一个二维数组,有10个桶,每个桶里能放多少个不确定,所以只能用最大容量arr.length,(牺牲内存)
int[][] buckets = new int[10][arr.length];
//创建一个一维数组,用来计算桶中各有几个数
int[] bucketCount = new int[10];
//找到数组中的最大值(数组值都大于0)
int temp = arr[0];
for(int i = 1; i < arr.length; i++){
if(temp < arr[i]){
temp = arr[i];
}
}
//确定最大值的长度
int times = (temp + "").length();
for(int t = 0, n = 1; t < times; t++, n *= 10){
//往桶里放值
for(int i = 0; i < arr.length; i++){
temp = arr[i] / n % 10;
buckets[temp][bucketCount[temp]++] = arr[i];
}
//从桶中取数据
int index = 0;
for(int i = 0; i < bucketCount.length; i++){
if(bucketCount[i] != 0){
for(int j = 0; j < bucketCount[i]; j++){
arr[index++] = buckets[i][j];
}
}
bucketCount[i] = 0;
}
}
}
}