1. 程式人生 > >排序演算法之六:基數排序

排序演算法之六:基數排序

演算法分析:(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;
                }
            }
        }
       }