1. 程式人生 > >JS排序算法總結:(八)基數排序

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

clas style dig ret .com strong spa radi 基本

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

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為進制數

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