mirror of
https://gitee.com/coder-xiaomo/algorithm-visualization
synced 2025-01-10 11:48:18 +08:00
添加归并排序、随机快速排序、计数排序、基数排序算法框架
This commit is contained in:
parent
d867150566
commit
4e857942f6
@ -10,7 +10,11 @@ function getSortClassList() {
|
||||
QuickSort,
|
||||
BubbleSort,
|
||||
SelectionSort,
|
||||
InsertionSort
|
||||
InsertionSort,
|
||||
MergeSort,
|
||||
RandomQuickSort,
|
||||
CountingSort,
|
||||
RadixSort,
|
||||
]
|
||||
}
|
||||
|
||||
@ -23,7 +27,8 @@ class Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "未命名算法"
|
||||
name: "未命名算法",
|
||||
available: false
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,7 +97,8 @@ class QuickSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "快速排序算法"
|
||||
name: "快速排序算法",
|
||||
available: true
|
||||
}
|
||||
}
|
||||
|
||||
@ -166,7 +172,8 @@ class BubbleSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "冒泡排序算法"
|
||||
name: "冒泡排序算法",
|
||||
available: true
|
||||
}
|
||||
}
|
||||
|
||||
@ -227,7 +234,8 @@ class SelectionSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "选择排序算法"
|
||||
name: "选择排序算法",
|
||||
available: true
|
||||
}
|
||||
}
|
||||
|
||||
@ -270,7 +278,6 @@ class SelectionSort extends Sort {
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 插入排序算法 Insertion Sort v0.1.0
|
||||
*
|
||||
@ -281,7 +288,8 @@ class InsertionSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "插入排序算法"
|
||||
name: "插入排序算法",
|
||||
available: true
|
||||
}
|
||||
}
|
||||
|
||||
@ -297,7 +305,6 @@ class InsertionSort extends Sort {
|
||||
sort(array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
console.log(array)
|
||||
for (let i = 1; i < array.length; i++) {
|
||||
let X = array[i]
|
||||
let j = i - 1
|
||||
@ -313,7 +320,6 @@ class InsertionSort extends Sort {
|
||||
sortWithAnimation(customAttr, array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
console.log(array)
|
||||
for (let i = 1; i < array.length; i++) {
|
||||
let X = array[i]
|
||||
animation.popupLinkedListItems(customAttr.id, i, {})
|
||||
@ -329,3 +335,167 @@ class InsertionSort extends Sort {
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 归并排序算法 Merge Sort v0.1.0
|
||||
*
|
||||
* @author coder-xiaomo
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
class MergeSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "归并排序算法"
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
将每个元素拆分成大小为1的分区
|
||||
递归地合并相邻的分区
|
||||
遍历 i = 左侧首项位置 到 右侧末项位置
|
||||
如果左侧首项的值 <= 右侧首项的值
|
||||
拷贝左侧首项的值
|
||||
否则: 拷贝右侧首项的值; 增加逆序数
|
||||
将元素拷贝进原来的数组中
|
||||
*/
|
||||
sort(array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
|
||||
sortWithAnimation(customAttr, array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 随机快速排序算法 Random Quick Sort v0.1.0
|
||||
*
|
||||
* @author coder-xiaomo
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
class RandomQuickSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "随机快速排序算法"
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
每个(未排序)的部分
|
||||
随机选取 pivot,和第一个元素交换
|
||||
存储索引 = pivot索引 +1
|
||||
从 i=pivot指数 +1 到 最右索引 的遍历
|
||||
如果 a[i] < a[pivot]
|
||||
交换 (i, 存储索引); 存储索引++;
|
||||
交换(pivot, 存储索引 - 1)
|
||||
*/
|
||||
sort(array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
|
||||
sortWithAnimation(customAttr, array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 计数排序算法 Counting Sort v0.1.0
|
||||
*
|
||||
* @author coder-xiaomo
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
class CountingSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "计数排序算法"
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
创建关键值(计数)数组
|
||||
遍历数列中的每个元素
|
||||
相应的计数器增加 1
|
||||
每轮计数,都从最小的值开始
|
||||
当计数为非零数时
|
||||
重新将元素存储于列表
|
||||
将计数减1
|
||||
*/
|
||||
sort(array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
|
||||
sortWithAnimation(customAttr, array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 基数排序算法 Radix Sort v0.1.0
|
||||
*
|
||||
* @author coder-xiaomo
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
class RadixSort extends Sort {
|
||||
|
||||
info() {
|
||||
return {
|
||||
name: "基数排序算法"
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
分别给每个数位(0到9)创造1个桶(数列),共计10个
|
||||
遍历每个数位
|
||||
遍历数列中的每个元素
|
||||
将元素移至相应的桶中
|
||||
在每个桶中,从最小的数位开始
|
||||
当桶不是空的
|
||||
将元素恢复至数列中
|
||||
*/
|
||||
sort(array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
|
||||
sortWithAnimation(customAttr, array) {
|
||||
if (array.length == 0)
|
||||
return array
|
||||
// todo
|
||||
console.log("尚未实现")
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
@ -132,6 +132,10 @@ function initialize() {
|
||||
const sortClass = new sortClassList[i](animation)
|
||||
const sortClassInfo = sortClass.info()
|
||||
|
||||
// 跳过未完成的算法
|
||||
if (!sortClassInfo['available'])
|
||||
continue
|
||||
|
||||
let ctrlBtn = document.createElement("button")
|
||||
ctrlBtn.innerHTML = sortClassInfo['name']
|
||||
ctrlBtn.onclick = function () {
|
||||
|
Loading…
Reference in New Issue
Block a user