diff --git a/src/assets/js/algorithm/sort.js b/src/assets/js/algorithm/sort.js index 8f68d87..4367bde 100644 --- a/src/assets/js/algorithm/sort.js +++ b/src/assets/js/algorithm/sort.js @@ -507,7 +507,7 @@ class CountingSort extends Sort { * 基数排序算法 Radix Sort v0.1.0 * * @author coder-xiaomo - * @date 2022-05-19 + * @date 2022-08-08 */ class RadixSort extends Sort { @@ -530,8 +530,48 @@ class RadixSort extends Sort { sort(array) { if (array.length == 0) return array - // todo - console.log("尚未实现") + + // refer: https://segmentfault.com/a/1190000021342923 + + // 取最大值 最大值的位数就是要循环遍历的次数 + const max = Math.max(...array); + + // 定义一个桶 + const buckets = Array.from({ length: 10 }, () => []); + + // 定义当前要遍历的位数 个位 十位 百位... + let m = 1; + while (m < max) { + // m < 最大值 + // 下方m要 m*=10 -> 每次遍历增加一位 + // 保证遍历完所有可能的位数 + + // 放入桶 + array.forEach(number => { + // digit表示某位数的值 + const digit = ~~((number % (m * 10)) / m); + + // 把该位数的值放到桶buckets中 + // 通过索引确定顺序 类比计数排序 + buckets[digit].push(number); + }); + + // 从桶buckets中取值 + // 完成此步后 就完成了一次位数排序 + let ind = 0; + buckets.forEach(bucket => { + while (bucket.length > 0) { + // shift从头部取值 + // 保证按照队列先入先出 + array[ind++] = bucket.shift(); + } + }); + + // 每次最外层while循环后m要乘等10 + // 也就是要判断下一位 比如当前是个位 下次就要判断十位 + m *= 10; + } + return array } diff --git a/src/assets/js/algorithm/test.js b/src/assets/js/algorithm/test.js index d1e9b7e..618391f 100644 --- a/src/assets/js/algorithm/test.js +++ b/src/assets/js/algorithm/test.js @@ -42,6 +42,7 @@ var sortAlgorithm = { selectionSort: new SelectionSort(animation), insertionSort: new InsertionSort(animation), randomQuickSort: new RandomQuickSort(animation), + radixSort: new RadixSort(animation), } // 遍历每一种算法