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


基數排序:

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

首先,我們先了解什么是基數。基數是根據具體的排序情況而定的,比如我們常見的基數是十進制-10,還有二進制-2。

其次,要熟記基數排序的思想:通過對每一個位上的值相排序,就可以完成對整個數組的排序。

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

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

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

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

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

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

第三遍排序的結果為:  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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM