高級排序之基數排序

1.什麼是基數排序

基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度爲O (nlog(r)m),其中r爲所採取的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

2.基數排序圖解

3.基數排序代碼實現

     public static void radixSort(int[] nums) {
        int len = nums.length;
        int die = 10;
        int dividend = 1;
        Map<Integer, List<Integer>> map = new HashMap<>();
        int max = 0;
        do {//循環比較位數 個十百千萬。。。
            for (int i = 0; i < len; i++) {
                if (nums[i] > max) {
                    max = nums[i];
                }
                int positionNum = nums[i] % die / dividend;
                List<Integer> list = map.getOrDefault(positionNum, new ArrayList<>());
                list.add(nums[i]);
                map.put(positionNum, list);
            }
            //比較位數後 除數 跟模均乘10
            die *= 10;
            dividend *= 10;

            //將排序的字段賦值回數組
            int index = 0;
            int nums_Index = 0;
            while (index < 10) {
                List<Integer> list = map.getOrDefault(index, new ArrayList<>());
                for (Integer integer : list) {
                    nums[nums_Index++] = integer;
                }
                map.remove(index);
                index++;
            }
        } while (dividend <= max);//當除數大於最大值後 不在繼續
    }

4.基數排序的效率

初看起來 ,基數排序的執行效率似乎好得讓人無法相信 。所有要做的只是把原始的數據項從數 組複製到鏈表 ,然後再複製回去 。如果有 IO 個數據項 ,則有 20 次複製。對每一位重複這個過程 。假設對 5 位的數字排序 ,就需要 20*5,等於100 次複製。如果有100 個數據項 ,那麼就有 200*5 等於 1000 次複製 。複製的次數和數據項的個數成正比 ,即 O(N) ,這是我們看到的效率最高的排序 算法 。

不幸的是 ,一般是這樣 :只要數據項越多 ,就需要越長的關鍵字 。如果數據項增加 10  倍 ,那 麼關鍵字就需要再增加另一位 。複製的次數是和數據項的個數與關鍵字的位數的乘積成正比 。位數 是關鍵字值的對數 ,因此在絕大多數的情況下 ,算法的執行效率倒退爲 O(N*logN),和快速排序算 法相同 。

儘管從數字中提取出每一位需要花費時間 ,但是沒有比較。每兩次複製需要一次位提取。然而, 一臺給定的計算機在二進制中的位提取操作快於比較操作 。當然,與歸併排序類似 ,基數排序所需 要的存儲空間是快速排序的二倍 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章