From 4e857942f66fd974255af8be38b4aee7b3d59b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= <2291200076@qq.com> Date: Thu, 19 May 2022 00:39:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BD=92=E5=B9=B6=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E3=80=81=E9=9A=8F=E6=9C=BA=E5=BF=AB=E9=80=9F=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E3=80=81=E8=AE=A1=E6=95=B0=E6=8E=92=E5=BA=8F=E3=80=81?= =?UTF-8?q?=E5=9F=BA=E6=95=B0=E6=8E=92=E5=BA=8F=E7=AE=97=E6=B3=95=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/js/algorithm/sort.js | 188 ++++++++++++++++++++++++++++++-- src/assets/js/index.js | 4 + 2 files changed, 183 insertions(+), 9 deletions(-) diff --git a/src/assets/js/algorithm/sort.js b/src/assets/js/algorithm/sort.js index e878289..31f957c 100644 --- a/src/assets/js/algorithm/sort.js +++ b/src/assets/js/algorithm/sort.js @@ -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 + } +} diff --git a/src/assets/js/index.js b/src/assets/js/index.js index 5723fc5..99a85fb 100644 --- a/src/assets/js/index.js +++ b/src/assets/js/index.js @@ -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 () {