mirror of
https://gitee.com/coder-xiaomo/algorithm-visualization
synced 2025-09-06 04:41:38 +08:00
添加归并排序、随机快速排序、计数排序、基数排序算法框架
This commit is contained in:
@@ -10,7 +10,11 @@ function getSortClassList() {
|
|||||||
QuickSort,
|
QuickSort,
|
||||||
BubbleSort,
|
BubbleSort,
|
||||||
SelectionSort,
|
SelectionSort,
|
||||||
InsertionSort
|
InsertionSort,
|
||||||
|
MergeSort,
|
||||||
|
RandomQuickSort,
|
||||||
|
CountingSort,
|
||||||
|
RadixSort,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,7 +27,8 @@ class Sort {
|
|||||||
|
|
||||||
info() {
|
info() {
|
||||||
return {
|
return {
|
||||||
name: "未命名算法"
|
name: "未命名算法",
|
||||||
|
available: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +97,8 @@ class QuickSort extends Sort {
|
|||||||
|
|
||||||
info() {
|
info() {
|
||||||
return {
|
return {
|
||||||
name: "快速排序算法"
|
name: "快速排序算法",
|
||||||
|
available: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +172,8 @@ class BubbleSort extends Sort {
|
|||||||
|
|
||||||
info() {
|
info() {
|
||||||
return {
|
return {
|
||||||
name: "冒泡排序算法"
|
name: "冒泡排序算法",
|
||||||
|
available: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,7 +234,8 @@ class SelectionSort extends Sort {
|
|||||||
|
|
||||||
info() {
|
info() {
|
||||||
return {
|
return {
|
||||||
name: "选择排序算法"
|
name: "选择排序算法",
|
||||||
|
available: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,7 +278,6 @@ class SelectionSort extends Sort {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 插入排序算法 Insertion Sort v0.1.0
|
* 插入排序算法 Insertion Sort v0.1.0
|
||||||
*
|
*
|
||||||
@@ -281,7 +288,8 @@ class InsertionSort extends Sort {
|
|||||||
|
|
||||||
info() {
|
info() {
|
||||||
return {
|
return {
|
||||||
name: "插入排序算法"
|
name: "插入排序算法",
|
||||||
|
available: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,7 +305,6 @@ class InsertionSort extends Sort {
|
|||||||
sort(array) {
|
sort(array) {
|
||||||
if (array.length == 0)
|
if (array.length == 0)
|
||||||
return array
|
return array
|
||||||
console.log(array)
|
|
||||||
for (let i = 1; i < array.length; i++) {
|
for (let i = 1; i < array.length; i++) {
|
||||||
let X = array[i]
|
let X = array[i]
|
||||||
let j = i - 1
|
let j = i - 1
|
||||||
@@ -313,7 +320,6 @@ class InsertionSort extends Sort {
|
|||||||
sortWithAnimation(customAttr, array) {
|
sortWithAnimation(customAttr, array) {
|
||||||
if (array.length == 0)
|
if (array.length == 0)
|
||||||
return array
|
return array
|
||||||
console.log(array)
|
|
||||||
for (let i = 1; i < array.length; i++) {
|
for (let i = 1; i < array.length; i++) {
|
||||||
let X = array[i]
|
let X = array[i]
|
||||||
animation.popupLinkedListItems(customAttr.id, i, {})
|
animation.popupLinkedListItems(customAttr.id, i, {})
|
||||||
@@ -329,3 +335,167 @@ class InsertionSort extends Sort {
|
|||||||
return array
|
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 sortClass = new sortClassList[i](animation)
|
||||||
const sortClassInfo = sortClass.info()
|
const sortClassInfo = sortClass.info()
|
||||||
|
|
||||||
|
// 跳过未完成的算法
|
||||||
|
if (!sortClassInfo['available'])
|
||||||
|
continue
|
||||||
|
|
||||||
let ctrlBtn = document.createElement("button")
|
let ctrlBtn = document.createElement("button")
|
||||||
ctrlBtn.innerHTML = sortClassInfo['name']
|
ctrlBtn.innerHTML = sortClassInfo['name']
|
||||||
ctrlBtn.onclick = function () {
|
ctrlBtn.onclick = function () {
|
||||||
|
Reference in New Issue
Block a user