2025-01-18 基数排序

This commit is contained in:
liangjinglin 2025-01-18 15:47:46 +08:00
parent 84c33359e7
commit c02758e709

View File

@ -0,0 +1,71 @@
package SortAlgori;
public class RadixSort {
private int[][] bucket;
private int[] arr;
// 用来记录每个桶的有效数量
private int[] bucketCounts;
public RadixSort(int[] arr){
// this.arr = new int[]{53,3,542,748,14,214};
this.arr = arr;
this.bucket = new int[10][arr.length];
this.bucketCounts = new int[10];
}
private void sort(){
int digit = 1;
while(true){
// 先从最低位数开始进行桶排序然后十位百位...
for(int i=0; i<arr.length; i++){
int temp = (arr[i]/digit) % 10;
bucket[temp][bucketCounts[temp]] = arr[i];
bucketCounts[temp] ++;
}
//当所有的数字排完后如果第0个桶的长度等于数组长度即已经排完了
if(bucketCounts[0] == arr.length){
break;
}
//从各个桶中取出元素回到原始队列中
int index = 0;
for(int i=0; i<10; i++){
if(bucketCounts[i] > 0){
for(int j=0; j<bucketCounts[i]; j++){
arr[index] = bucket[i][j];
index ++;
}
}
bucketCounts[i] = 0;
}
//取完后位数对位数*10,已作下一次排序
digit *= 10;
}
}
public void show(){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = new int[80000];
System.out.println("排序前的序列:");
for(int i=0; i<80000; i++){
arr[i] = (int)(Math.random()*100000);
System.out.print(arr[i] + " ");
}
RadixSort radixSort = new RadixSort(arr);
long startTime = System.currentTimeMillis();
radixSort.sort();
long endTime = System.currentTimeMillis();
System.out.println("排序后的序列:");
radixSort.show();
System.out.println("排序所花费的时间:" + (endTime - startTime) + "ms");
}
}