基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序算法的主要优点是在处理大量数据时,其时间复杂度为O(nlogn),空间复杂度为O(1)。
下面是基数排序的Java实现:
import java.util.Arrays;
//基数排序
public class RadixSort {
public static void main(String[] args) {
int[] arr = {57,71,41,208,10,39,1,6,15,106,109,107,20,30,50};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr) {
//定义桶
int [][] bucket = new int[10][arr.length];
//定义桶记录
int[] elementCounts = new int[10];
//获取最大值的位数
int max = arr[0];
for(int m = 0;m<arr.length;m++) {
if(arr[m]>max) {
max = arr[m];
}
}
int maxLength = (max+"").length();
int n = 1;
for(int h=0;h<maxLength;h++) {
//数据放入
for(int i=0;i<arr.length;i++) {
int element = arr[i]/n%10;//element代表个位数值,也代表要放入哪号桶
int count = elementCounts[element];//读取桶记录当中的数据
bucket[element][count] = arr[i];//数据存入
elementCounts[element]++;//桶记录+1
}
//数据取出
int index = 0;//定义游标遍历数组,取出的数据要存放的下标
//遍历桶记录
for(int k = 0;k<elementCounts.length;k++) {
if(elementCounts[k]!=0) {
//定义游标遍历对应的桶里边的数据
for(int l=0;l<elementCounts[k];l++) {
arr[index] = bucket[k][l];
index++;
}
}
//清除桶记录
elementCounts[k] = 0;
}
n = n*10;
//System.out.println(Arrays.deepToString(bucket));
}
}
}
基数排序的基本思想是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。每次比较,都是将对应的数放入到对应的桶中,然后再从桶中取出。
首先,我们需要找到数组中的最大值,以确定最大位数。然后,我们按照每一位进行排序。对于每一位,我们都创建一个新的桶,并将元素放入相应的桶中。然后,我们从每个桶中取出元素,放回到原数组中。最后,我们继续处理下一位。
优点:基数排序的时间复杂度为O(nlogn),空间复杂度为O(1),因此它非常适合处理大量数据。此外,基数排序是稳定的排序算法,即相等的元素的相对顺序不会改变。
缺点:基数排序需要额外的存储空间来存储桶,这可能会导致空间复杂度增加。此外,基数排序只适用于非负整数。