mirror of
https://gitee.com/coder-xiaomo/algorithm-visualization
synced 2025-01-10 11:48:18 +08:00
实现 基数排序算法(不要合分支);动画展示不好展示
This commit is contained in:
parent
7c62e215c5
commit
5d6d7096e6
@ -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
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,7 @@ var sortAlgorithm = {
|
||||
selectionSort: new SelectionSort(animation),
|
||||
insertionSort: new InsertionSort(animation),
|
||||
randomQuickSort: new RandomQuickSort(animation),
|
||||
radixSort: new RadixSort(animation),
|
||||
}
|
||||
|
||||
// 遍历每一种算法
|
||||
|
Loading…
Reference in New Issue
Block a user