排序演算法之六:基數排序
演算法分析:(radixsort)則是屬於“分配式排序”(distribution sort),基數排序法又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排。
基數排序(Radix sort)是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是隻能使用於整數。它是這樣實現的: 將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零. 然後, 從最低位開始, 依次進行一次排序.這樣從最低位排序一直到最高位排序完成以後, 數列就變成一個有序序列.
基數排序的方式可以採用LSD(Least significantdigital)或MSD(Most significantdigital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始。
複雜度:
時間複雜度為O (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。
public void radixsort(int[] arr){
//儲存陣列中的最大值
int max=Integer.MIN_VALUE;
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
//計算最大數字是幾位數
int maxLength=(max+"").length();
int[][] temp=new int[10][arr.length];
//用於記錄在temp中相應的陣列中存放數字的數量
int[]counts=new int[10];
//根據最大長度的數字決定比較的次數
for(int i=0,n=1;i<maxLength;i++,n*=10){
//把每個數分別取餘
for(int j=0;j<arr.length;j++){
//計算餘數
int ys=arr[j]/n%10;
//把資料放入指定的陣列中
temp[ys][counts[ys]]=arr[j];
//記錄數量
counts[ys]++;
}
int index=0;
//把數字取出來
for(int k=0;k<counts.length;k++){
if(counts[k]!=0){
//放回原陣列
for(int l=0;l<counts[k];l++){
arr[index]=temp[k][l];
index++;
}
//把數量為0;
counts[k]=0;
}
}
}
}