速度最快==》但是最消耗内存,当数据量是80000000的时候需要消耗的内存是3.2g==》会使虚拟机出现堆溢出异常
* @program: structureAndArithmetic
* @description: 基数排序
* @author: guxiaopeng
* @create: 2020-12-19 22:37
**/
public class RadixSort {
public static void main(String[] args) {
int[] arr={53,3,542,748,14,214};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void radixSort(int[] arr)
{
// 获取数组中位数最大的数
int max=arr[0];
for (int j = 0; j <arr.length ; j++) {
if (arr[j]>max)
{
max=arr[j];
}
}
int maxSize=(max+"").length();
// 创建十个桶==》二维数组
int[][] bucket=new int[10][arr.length];
// 创建桶中元素的计数器,==》用一位数组记录数据,一位数组的索引代表桶的编号,值为桶中数据的索引
int[] backetCount=new int[10];
// 取出数组中的数据根据个位、十位...的值存入对应桶编号的桶中
for (int k = 0, n=1; k < maxSize; k++,n*=10) {
for (int i = 0; i <arr.length; i++) {
// 取出数组中数据的个位或者十位...的值==>一次类推
int value=arr[i]/n%10;
// 将值存入到对应的桶中
bucket[value][backetCount[value]]=arr[i];
backetCount[value]+=1;
}
int index=0;
// 将桶中的数据取出来存储到数组中
for (int m = 0; m <backetCount.length ; m++) {//遍历每个同将桶中存在数据的桶,遍历出来存储到原来的数组中
if (backetCount[m]!=0)//因为桶的一位数组计数器的值是记录桶中没有数据的,值
{
for (int c = 0; c < backetCount[m]; c++) {//遍历有数据的桶,backetCount[]数组的值存储了,桶中保存数据的个数
arr[index++]=bucket[m][c];
}
}
// 将数据从同种遍历出来存储到数组中后,必须将对应改桶的一位数组计数器,记录桶中的数据的值给清空,以备下次想桶中存储数据,记录桶中数据个数使用
backetCount[m]=0;
}
}
}
}