基数排序(桶排序)算法
基数排序(桶排序)实现原理:
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
时间复杂度:O(nlog(r)m)
java代码实现:
//基数排序 (桶排序) 负数不行,小数不行
public class RadixSort {
public static void main(String[] args) {
int[] arr = new int[80000000];
for (int i = 0; i < 80000000; i++) {
int random = (int) (Math.random() * 100);
arr[i] = random;
}
Date date = new Date(System.currentTimeMillis());
System.out.println(date);
radixSort(arr);
date = new Date(System.currentTimeMillis());
System.out.println(date);
}
public static void radixSort(int[] arr) {
int maxArr = arr[0];
//首先获取数组中最大数的位数
for (int i = 0; i < arr.length; i++) {
if (maxArr < arr[i]) {
maxArr = arr[i];
}
}
//用特殊的方法获取整数的位数
int maxLength = (maxArr + "").length();
//准备开始排序
//首先创建10个桶,用来存放数据
int[][] bucket = new int[10][arr.length];
//每个水桶的索引(即 每个水桶 里面有多少个数据)
int[] bucketOfElement = new int[bucket.length];
for (int l = 0,n=1; l < maxLength; l++,n *= 10) {
int currentnum = 0;
//将arr数组中的数 进行分开,分到对应的桶中
for (int i = 0; i < arr.length; i++) {
currentnum = arr[i] / n % 10;
bucket[currentnum][bucketOfElement[currentnum]] = arr[i];
bucketOfElement[currentnum]++;
}
//依次将桶中的数据 合到数组中
int indexArr = 0;
int indexBucket = 0;
for (int j = 0; j < bucketOfElement.length; j++) {
while (bucketOfElement[j] != 0) {
arr[indexArr] = bucket[j][indexBucket];
indexArr += 1;
indexBucket += 1;
bucketOfElement[j]--;
}
indexBucket = 0;
}
}
}
}
执行时间展示:
随机排序80000000个随机生成的数耗时2s