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

系列文章目录

删除有序数组中的重复项
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.hqwc.cn/news/59259.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成树协议

文章目录 STP冗余交换网络为什么存在广播风暴&#xff1f;广播的危害&#xff1f;交换环路的危害&#xff1f; 工作机制BPDU什么是最好的bpduBPDU触发机制 STP选举步骤配置协议分析字段分析开销模式端口状态 故障类型根桥故障直连故障间接故障 &#xff08;链路中间可能有HUB&a…

WEB集群——tomcat

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 一、简述静态网页和动态网页的区别 &#xff08;1&#xff09;静态网页 1.什么是静态网页 请求响应信息&#xff0c;发…

【云原生】深入掌握k8s中Pod和生命周期

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …

文件上传漏洞(webshell)和文件包含漏洞

一、防护 1、防护 1、判断文件后缀&#xff0c;为图片的话才让上传成功。 2、解析文件内容&#xff08;文件幻数&#xff09;判断文件头和文件尾部是否一致 幻数 常见的 3、隐藏按钮&#xff08;带上code唯一值&#xff09; 4、二次渲染&#xff08;类似拿着你的图片&#xff…

IoTDB 1.x 开启外部访问

对于部署的IoTDB数据库&#xff0c;如果需要局域网内其他设备进行访问的处理。 1、防火墙开放端口 无论windows还是liunx都需要你将6667默认的端口加入防火墙中&#xff0c;否则肯定是无法访问端口 2、修改配置文件 对conf/iotdb-datanode.properties文件中的 修改为本机的…

提取字符串标签中的文字js

DOM操作&#xff1a; const extractText (str) > {const parser new DOMParser();const doc parser.parseFromString(str, text/html);const textNodes doc.body.innerText.trim().split(\n);return textNodes; };const input <div>提取文字</div><p>…

《Python入门到精通》函数详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 函数 1、函数的调用2、函数的参数2.1、变量的就近原则2.2、传递参数2.3、形参和实…

收藏!新增6省!2023年度杰青、优青名单汇总(附下载)

2023省级自然科学基金项目名单 杰青、优青项目是国家及各省市为促进青年科学和技术人才的成长&#xff0c;加速培养造就一批进入世界科技前沿的优秀学术带头人而特别设立的科学基金&#xff0c;是各个科研单位竞相争夺的青年科技人才。 按照惯例&#xff0c;2023年国家自然基…

【TypeScript】TS接口interface类型(三)

【TypeScript】TS接口interface类型&#xff08;三&#xff09; 【TypeScript】TS接口interface类型&#xff08;三&#xff09;一、接口类型二、实践使用2.1 常规类型2.2 设置属性只读 readonly2.3 设置索引签名2.4 设置可选属性2.5 函数类型接口 一、接口类型 TypeScript中的…

树和二叉树 --- 数据结构

目录 1.树的概念及结构 1.1树的概念 1.2树的表示 1.3树在实际生活中的运用 2.二叉树的概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n (n>0)个有限结点组成…

广州VR制作 | 利用VR元宇宙平台开展林地管理培训的优势

在林业领域&#xff0c;实地调查是获取准确数据和深入了解森林生态的重要手段。然而&#xff0c;传统的实地调查方法存在诸多问题&#xff0c;如时间成本高、人力物力投入大、安全风险高等。为了解决这些教学痛点&#xff0c;我们引入了虚拟现实(VR)技术&#xff0c;通过虚拟林…

【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、讲解 &#x1f4a5;1 概述 由于能源的日益匮乏&#xff0c;电力需求的不断增长等&#xff0c;配电网中分布式能源渗透率不断提高&#xff0c;且逐渐向主动配电网方…