【数据结构与算法】Vue3实现选择排序动画效果与原理拆解

news/2025/3/15 12:55:31/

系列文章目录

删除有序数组中的重复项
JavaScript实现选择排序


文章目录

  • 系列文章目录
  • 1、选择排序的原理
    • 1.1、选择排序的基本步骤
    • 1.2、拆解思路
  • 2、动画演示原理
  • 3、代码实现
  • 4、优化后的选择排序
  • 5、用Vue3实现选择排序的动画效果(第二部分的动画效果图)


1、选择排序的原理

选择排序(Selection Sort)是一种简单的排序算法,其基本思想是从待排序的数据中选择最小(或最大)的元素,然后将其放到已排序的序列的末尾(或开头)。该算法的时间复杂度为O(n^2),其中n是待排序数据的数量,因此在大规模数据上效率较低,但对于小规模数据或部分有序数据仍然是一种有效的排序方法。

1.1、选择排序的基本步骤

1、找到未排序部分中的最小元素。
2、将该最小元素与未排序部分的第一个元素交换位置,将其纳入已排序部分。
3、在剩余未排序部分中重复步骤1和2,直到所有元素都被纳入已排序部分。

1.2、拆解思路

比如说现有数组 arr = [ 6, 25, 15, 7 , 19 , 12 , 26 , 17 , 5 , 13 ],那么选择排序的意思就是

第一趟排序就是从第一位开始,遍历所有的数组数据 ,找到其中最小的数据,也就是 5,然后把5与数组第一个元素交换位置,也就是arr[0]的位置;

52515719122617613

第二趟排序,重复第一趟的操作,找到最小值6,交换到arr[1]的位置,得出以下结果:

56157191226172513


在重复(数组arr长度-1)遍数后,整个数组就已经变成有序了

56712131517192526

2、动画演示原理

请添加图片描述

3、代码实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Select sort</title><script>function selectionSort(arr) {let n = arr.length;for (let i = 0; i < n; i++) {let minIndex = i;for (let j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 交换位置let temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr;}// 示例let unsortedArray = [6, 25, 15, 7, 19, 12, 26, 17, 5, 13];document.write( "原始数组:", unsortedArray )document.write( "<br>" )let sortedArray = selectionSort(unsortedArray);document.write( "排序后的数组:", sortedArray )</script></head>
<body></body>
</html>

结果:

原始数组:6,25,15,7,19,12,26,17,5,13
排序后的数组:5,6,7,12,13,15,17,19,25,26

4、优化后的选择排序

1、外层的遍历次数可以减少一次,最后2条数据经过对比交换位置,已经排好序了;
2、当内层第一数就是最小值,不需要生成临时变量,也不需要与自己交换位置

		function selectionSort(arr) {let n = arr.length;for (let i = 0; i < n - 1; i++) {let minIndex = i;for (let j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}if (minIndex !== i) {// 交换位置let temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}return arr;}

5、用Vue3实现选择排序的动画效果(第二部分的动画效果图)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue3实现选择排序动画效果演示</title><!-- Import element-plus style --><link rel="stylesheet" href="//unpkg.com/element-plus/dist/index.css" /><!-- Import Vue 3 --><script src="//unpkg.com/vue@3"></script><!-- Import axios --><script src="//unpkg.com/axios/dist/axios.min.js"></script><!-- Import element-plus --><script src="//unpkg.com/element-plus"></script></head>
<body><div id="app"><div id="sort"><table cellspacing="0"><tr><template v-for="(data,index) in sortedData" :key="index"><td><input type="button" :value="data" class="sortedData" :style="'height:'+ data * 10 + 'px' "></td></template><template v-for="(data,index) in data" :key="index"><td><input v-if="sortingPoint==index" type="button" :value="data" :style="'height:'+ data * 10 + 'px;'" class="sortingBtn"  ><input v-else-if="sortingMinPoint==index" type="button" :value="data" :style="'height:'+ data * 10 + 'px;'" class="sortingMinBtn"  ><input v-else="sortingPoint!=index" type="button" :value="data" :style="'height:'+ data * 10 + 'px;'" ></td></template></tr></table></div></div><script>const App = {data(){return {data: [ 6, 25, 15, 7 , 19 , 12 , 26 , 17 , 5 , 13 ] ,loading: false,timer:null, //定时器名称sortedData:[] , //已排序字段sortTimer:null, // 内排序延时器sortingPoint:1, //正在排序的位置sortingMinPoint:0 //正在排序时最小的位置}},mounted() {this.sortData();this.setTime();},methods:{setTime() {//每隔一分钟运行一次保存方法this.timer = setInterval(()=>{// console.log("停顿6秒")this.sortData();}, 5000 )},setSortTime() {//每隔一分钟运行一次保存方法this.sortTimer = setInterval(()=>{// console.log("停顿1秒")this.sortMinData();},1000)},sortData() {let that = this;this.setSortTime() ;},sortMinData() {// 如果只剩一位数,不需要排序if( this.data.length == 1 ) {this.sortedData.push(this.data[this.sortingMinPoint]);this.data = [];clearInterval(this.sortTimer);  // 清除定时器this.sortTimer = null;clearInterval(this.timer);  // 清除定时器this.timer = null;console.log("排序完成")} else {//找到最小值的位置if( this.data[this.sortingMinPoint] > this.data[this.sortingPoint] ) {this.sortingMinPoint = this.sortingPoint;}if( this.sortingPoint == this.data.length -1 ) {this.sortedData.push(this.data[this.sortingMinPoint]);this.data.splice(this.sortingMinPoint, 1);// 结束时重置为0this.sortingPoint = 1;this.sortingMinPoint = 0;clearInterval(this.sortTimer);  // 清除定时器this.sortTimer = null;} else {this.sortingPoint ++;}}}},beforeDestroy(){clearInterval(this.timer);  // 清除定时器this.timer = null;clearInterval(this.sortTimer);  // 清除定时器this.sortTimer = null;},}const App2 = Vue.createApp(App)App2.use(ElementPlus)App2.mount(app)</script>
</body>
<style >#sort {background-color: azure;height: 300px;width: 600px;}.sortingBtn {background-color: red;}.sortingMinBtn {background-color: aquamarine;}.sortedData {background-color: burlywood;}td{vertical-align: bottom;}</style></html>

http://www.ppmy.cn/news/1018612.html

相关文章

Weblogic未授权远程代码执行漏洞 (CVE-2023-21839)

前言&#xff1a; Weblogic 允许远程用户在未经授权的情况下通过IIOP/T3进行JNDI lookup 操作&#xff0c;当JDK版本过低或本地存在javaSerializedData时&#xff0c;这可能会导致RCE漏洞。 0x00 环境设置 此次实验&#xff0c;我们使用P神的vulhub。启动环境&#xff1a; cd…

leetcode410. 分割数组的最大值 动态规划

hard:https://leetcode.cn/problems/split-array-largest-sum/ 给定一个非负整数数组 nums 和一个整数 m &#xff0c;你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1&#xff1a;输入&#xff1a;nums [7,2,5,1…

Windows 安装 pandoc 将 jupyter 导出 pdf 文件

Windows 安装 pandoc 将 jupyter 导出 pdf 文件 1. 下载 pandoc 安装文件2. 安装 pandoc3. 安装 nbconvert4. 使用 pandoc 1. 下载 pandoc 安装文件 访问 https://github.com/jgm/pandoc/releases&#xff0c;下载最新版安装文件&#xff0c;例如&#xff0c;3.1.6.1 版&#…

javaScript:如何获取html中的元素对象

目录 前言&#xff1a; 方法 1.通过id获取元素 2.通过标签名获取元素 3.通过类名class获取元素 获取body的方法 1.document.getElementsByTagName(body)[0] 2.document.body 相关代码 前言&#xff1a; 通过获取HTML中的元素对象&#xff0c;JavaScript可以对网页进行动…

42. 疯狂爬取王者荣耀所有皮肤高清海报(文末源码)

目录 前言 目的 思路 代码实现 1. 导包&#xff0c;部署好环境 2. 伪装请求头 3. 访问英雄列表&#xff0c;获取英雄ID 4. 分别访问各英雄主页&#xff0c;查看图片详情 5. 写入本地文件夹&#xff08;文件夹自动命名&#xff09; 完整源码 运行效果 总结 前言 阔…

Elasticsearch使用中出现的错误

Elasticsearch使用中出现的错误 1、分页查询异常 在分页的过程中出现了一个问题是当查询的数据超过10000条的时候报了异常&#xff1a; from size must be less than or equal to: [10000]这个问题最快捷的解决方式是增大窗口大小&#xff1a; curl -XPUT http://127.0.0.…

银河麒麟V10 SP3 X86 二进制文件部署 mysql-5.7.29 GTID 半同步复制的双主架构

文章目录 [toc]啰嗦一下mysql 的 AB 复制和 gtid 复制的优缺点AB 复制&#xff08;Asynchronous Replication&#xff09;GTID 复制&#xff08;Global Transaction Identifier Replication&#xff09; mysql gtid 并行复制和半同步复制的优缺点并行复制&#xff08;Parallel …

C++学习笔记总结练习:并发编程与多线程

并发编程与多线程 1. 基础知识 C多线程 线程&#xff1a;线程是操作系统能够进行CPU调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务&#xff0c;也可以用多个进程去完成一个任务&#xff0c;它们的…