數據結構Java版之基數排序(四)

基數排序:算法

  基數排序分爲兩種:第一種是LSD ,從最低位開始排序, 第二種是 MSD 從最高位開始排。這裏介紹第一種LSD排序算法。數組

首先,咱們先了解什麼是基數。基數是根據具體的排序狀況而定的,好比咱們常見的基數是十進制-10,還有二進制-2。spa

其次,要熟記基數排序的思想:經過對每個位上的值相排序,就能夠完成對整個數組的排序。code

  基數排序的算法實現流程:遍歷全部數組元素,找出元素最大的位值 -------->從低位到高位把數組元素上的位值存入鏈表中-------->遍歷全部鏈表,將鏈表裏面的值從新賦值給數組,再狀況鏈表。blog

  例如:對數組   int[ ]  data = {421, 240, 35, 532, 305, 430, 124};進行排序,首先咱們要作的是對個位上的數值進行排序。排序

第一遍排序的結果爲:  240 430 421 532 124 35 305 
rem

再進行十位上的數值排序:get

第二遍排序的結果爲:  305 421 124 430 532 35 240源碼

再進行百位上的數值排序:class

第三遍排序的結果爲:  35 124 240 305 421 430 532 

最後咱們的到的排序結果就是: 35 124 240 305 421 430 532 

至此,已經完成了對數組的排序

  附源碼:

public class RadixSort {
    @Test
    public void fun() {
        int[] n = {421, 240, 35, 532, 305, 430, 124};
        radixSort(n);
        for(int i : n) {
            System.out.print(i + " ");
        }
    }
    //實現基數排序 LSD-從最低位開始排 MSD-從最高位開始排
    public void radixSort(int[] data) {
        int maxBin = maxBin(data);
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        for(int i  = 0; i < 10; i ++) {
            list.add(new ArrayList<Integer>());
        }
        for(int i = 0, factor = 1; i < maxBin; factor *= 10, i ++) {
            for(int j = 0; j < data.length; j ++) {
                list.get((data[j]/factor)%10).add(data[j]);
            }
            for(int j = 0, k = 0; j < list.size(); j ++) {
                while(!list.get(j).isEmpty()) {
                    data[k] = list.get(j).get(0);
                    list.get(j).remove(0);
                    k ++;
                }
            }
        }
    }
    //計算數組裏元素的最大位數
    public int maxBin(int[] data) {
        int maxLen = 0;
        for(int i = 0; i < data.length; i ++) {
            int size = Integer.toString(data[i]).length();
            maxLen =  size > maxLen ? size : maxLen;
        }
        return maxLen;
    }
}
相關文章
相關標籤/搜索