基数排序基本思想:
基数排序是桶排序的升级版,一个数无疑是由10个数字构成,因此我们创建十个桶。一个数从个位依次向上位次取数,将取到的这个位次数与桶进行匹配,再将这个数放入桶中整个数组完成放入后,再从0桶依次取出,放入原数组然后重复上面的操作,直到位次取完后,排序完成。
也就是说第一轮是对只有个位的数排序 ,第二轮是对十位数,第三轮是对百位数....
public class RadixSort {
public static void main(String[] args) {
// int[] arr = {5, 2, 123, 54, 12, 5235};
// radixSort(arr);
// System.out.println(Arrays.toString(arr));
int[] randomArray = new int[80000000];
for (int i = 0; i < randomArray.length; i++) {
randomArray[i] = (int) (Math.random() * 800000000);
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS");
String formatted = simpleDateFormat.format(date);
System.out.println("排序前的时间:" + formatted);
radixSort(randomArray);
Date dateAfter = new Date();
String dateAfterFormat = simpleDateFormat.format(dateAfter);
System.out.println("排序后的时间:" + dateAfterFormat);
// System.out.println(Arrays.toString(randomArray));
}
public static void radixSort(int[] arr) {
// 创建十个桶
Bucket[] buckets = new Bucket[10];
for (int i = 0; i < buckets.length; i++) {
buckets[i] = new Bucket(arr.length);
}
// 外层循环表示取第几位的数
for (int i = 0, n = 1; i < getArrMaxValueLength(arr); i++, n *= 10) {
// 将值按照取到的位放入不同的桶中
for (int k : arr) {
int value = k / n % 10;
buckets[value].addValue(k);
}
int arrIndex = 0;
// 放回原数组
for (Bucket bucket : buckets) {
// top>=0的时候才表示有数据,bottom表示第一个数据,这样写只是为了方便
// 当bottom==top的时候,表示数据取完
while (bucket.top >= 0 && bucket.bottom <= bucket.top) {
arr[arrIndex++] = bucket.getBucketValue();
}
// 将桶的top和bottom指向-1
bucket.clearBucket();
}
}
}
public static int getArrMaxValueLength(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
return (max + "").length();
}
}
/**
* 表示一个桶
*/
class Bucket {
// 桶大小
int bucketSize;
// 存放数据
int[] bucket;
// 桶当前最新数据的位置
int top = -1;
int bottom = -1;
public Bucket(int bucketCount) {
this.bucketSize = bucketCount;
bucket = new int[bucketCount];
}
public int getBucketValue() {
return bucket[bottom++];
}
public void clearBucket() {
top = -1;
bottom = -1;
}
public void addValue(int value) {
bucket[++top] = value;
bottom = 0;
}
}