JS排序算法總結:(八)基數排序


目的:掌握 基數排序 的 基本思想與過程、代碼實現、時間復雜度

1、基本思想與過程:(只針對數字)

  (1)首先確定基數為10,數組的長度也就是10.每個數都會在這10個數中尋找自己的位置。

  (2)不同於BinSort會直接將數放在數組的下標處,如將 [34] 放在下標為34的位置,即a[34] = 34;基數排序是將34分開為3和4,第一輪排序根據最末位放在數組的下標4處,第二輪排序根據倒數第二位放在數組的下

標3處,然后遍歷數組即可。

 

2、代碼實現:

function RadixLSDSort (arr, digit) {
    const radix = 10;   // 基數,以10進制來進行排序
    var i = 0, 
        j = 0,
        count = Array(radix), // 0~9的桶
        len = arr.length,
        bucket = Array(len);
    // 利用LSD,也就是次位優先
    for (var d = 0; d < digit; d++) {
        for (i = 0; i < radix; i++) {
            count[i] = 0;
        }
        // 向各個桶中添加元素,並統計出每個桶中裝的個數
        for (i = 0; i < len; i++) {
            j = getDigit(arr[i], d);
            count[j]++;
        }
        // count的越往后值最大,最大值為arr.length
        // count數組的值為,該位數值為該索引的數字總數
        for (i = 1; i < radix; i++) {
            count[i] = count[i] + count[i - 1];
        }
        // 按照桶的順序將導入temp中
        for (i = len - 1; i >= 0; i--) {
            j = getDigit(arr[i], d);
            bucket[count[j] - 1] = arr[i];
            count[j]--; 
        }
        // 將已經根據相應位數排好的序列導回arr中
        for (i = 0; i < len; i++) {
            arr[i] = bucket[i];
        }
    }   
    return arr
}

// 獲得每位的數字
function getDigit(x,d){
    var a = [ 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000];
    return (Math.floor(x / a[d]) % 10);
}

3、時間復雜度:O(d(n+r),其中:d為待排列數字的最大位數,n為待排序列的長度,r為進制數 


免責聲明!

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



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