一.简介
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,它是将要排序的元素分配至某些“桶”中
1.找到数据中最大的数据,计算数据位数
2.依次取出数据从个位开始判断,把数据丢到对应桶中。把桶中的数据依次赋值到原始数组
二.实现
package com.vincent;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception{
int[] arr = new int[32];
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random() * 100);
}
System.out.println(Arrays.toString(arr));
bucketSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
*基数排序,只支持正数,如果需要支持负数则需要进一步优化
*/
public static void bucketSort(int[] arr){
int[][] buckets = new int[10][arr.length];
//记录对应桶中数据元素个数
int[] counts = new int[10];
//寻找最大的数
int max = arr[0];
for(int i=1;i<arr.length;i++){
if(max < arr[i]){
max = arr[i];
}
}
//计算总的需要多少次桶排序
int count = 0;
for(int tmp=1;tmp<max;tmp*=10){
count++;
}
//定义需要整除的基数
int base = 1;
for(int i=0;i<count;i++,base*=10){
//把数据放入桶中
for(int j=0;j<arr.length;j++){
//计算需要放入的桶索引
int index = arr[j]/base%10;
buckets[index][counts[index]++] = arr[j];
}
//把数据从桶中放入原数组
int pos = 0;
for(int j=0;j<counts.length;j++){
for(int k=0;k<counts[j];k++){
arr[pos++] = buckets[j][k];
}
}
//清空元素个数记录数组
for(int j=0;j<counts.length;j++){
counts[j] = 0;
}
}
}
}
效果:
三.总结
基数排序时间复杂度:O(k*n),k表示数据位数,n表示数据个数
基数排序需要耗费较多内存空间,属于空间换时间算法