【数据结构与算法】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);

                            // 结束时重置为0
                            this.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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/66167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【uniapp 小程序开发语法篇】资源引入 | 语法介绍 | UTS 语法支持(链接格式)

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; uni-app | 小程序开发 开发工具&#xff1a;HBuilderX 小程序开发语法篇 引用组件easycom Js文件引入NPM支持 Css文件引入静态资源引入css 引入静态资源如何引入字体图标&#xff1f;css 引入字体图标示例nvue 引入字体…

基于2.4G RF开发的无线游戏手柄解决方案

平时喜欢玩游戏的朋友&#xff0c;肯定知道键鼠在某些类型的游戏适配和操作方面&#xff0c;不如手柄。作为一个游戏爱好者&#xff0c;还得配上一个游戏手柄才行。比如动作和格斗、体育游戏&#xff0c;由于手柄更合理的摇杆位置和按键布局&#xff0c;操作起来也是得心应手。…

异常的使用

第一章 异常 1、异常概念 异常&#xff0c;就是不正常的意思。在生活中&#xff1a;医生说&#xff0c;你的身体某个部位有异常&#xff0c;该部位和正常相比有点不同&#xff0c;该部位的功能将受影响&#xff0c;在程序中的意思就是&#xff1a; 异常&#xff1a;指的是程序…

电脑怎么查看连接过的WIFI密码(测试环境win11,win10也能用)

电脑怎么查看连接过的WIFI密码 方法一&#xff1a;适用于正在连接的WIFI密码的查看 打开设置 点击“网络和Internet”&#xff0c;在下面找到“高级网络设置”点进去 在下面找到 “更多网络适配器选项” 点进去 找到 WLAN &#xff0c;然后双击它 5.然后点击“无线属性” 6.…

C++11之右值引用

C11之右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的 右值引用&#xff08;rvalue reference&#xff09;语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用&#xff08;lvalue reference&#xff09;。无论左值引用还是右值引用&#…

Qt 信号与槽

信号与槽&#xff08;signal & slot&#xff09;是Qt编程的基础&#xff0c;使Qt中处理界面各个组件的交互操作变得更加直观和简单。 信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件&#xff0c;如PushButton最常见的信号就是鼠标单击时发射的clicked()…

Promise详细版

promise基础原理到难点分析 常见的Promise的方法解读 扩展async和await深入分析 逐步分析Promise底层逻辑代码 一、Promise基础 1.什么是promise 为了解决回调地狱&#xff1a; //2.设置点击事件btn.onclick function() {//3.创建ajax实例化对象let xhr new XMLHttpRe…

【云原生】详细学习Docker-Swarm部署搭建和基本使用

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;云原生_征服bug的博客-CSDN博客 目录 Docker-Swarm编排 1.概述 2.docker swarm优点 3.节点类型 4.服务和任务 5.路由网格 6.实践Docker swarm 1.概述 Docker Swarm 是 Docker 的集群管理工具。它将 Doc…

使用vue-grid-layout时 You may need an appropriate loader to handle this file type.

使用vue-grid-layout时 You may need an appropriate loader to handle this file type. node版本不匹配 我的node v14.16.0 vue-gride-layout 需要用 v 2.3.7的版本 卸载后重新安装即可

Swift async/await 并发中如何将任务组(TaskGroup)转换为异步序列(AsyncSequence)

功能需求 在 Swift 新结构化并行模型的开发中, 提出了任务组(TaskGroup)和异步序列(AsyncSequence)的概念。有时候,为了简洁和效率方面的原因,我们需要将 TaskGroup 的结果转换为异步序列。 如上图所示,我们试图将任务组的结果转换为异步序列,但不幸失败了。 那么…

GCC编译过程:预处理->编译->汇编->链接

目录 引言 概括介绍 一、预处理 二、编译 三、汇编 四、链接 总结 引言 当使用集成开发环境&#xff08;IDE&#xff09;进行C语言编程时&#xff0c;点击"编译"按钮后&#xff0c;整个C程序从源代码到可执行文件的生成过程会自动完成。IDE会在后台为我们执行C…

微服务——es数据聚合+RestClient实现聚合

数据聚合 聚合的种类 DSL实现Bucket聚合 如图所示&#xff0c;设置了10个桶&#xff0c;那么就显示了数量最多的前10个桶&#xff0c;品牌含有7天酒店的有30家&#xff0c; 品牌含有如家的也有30家。 修改排序规则 限定聚合范围 DSL实现Metrics聚合 如下案例要求对不同的品…

【Go 基础篇】Go语言初探:第一段代码与执行过程解析

介绍 Go语言&#xff08;也称为Golang&#xff09;作为一门现代化的编程语言&#xff0c;以其简洁的语法、高效的性能和丰富的标准库而受到了广泛关注和使用。对于初学者来说&#xff0c;编写和执行第一段Go代码是迈向这门语言的重要一步。本篇博客将带您深入了解Go语言的第一…

来讲一讲面试必问的异步FIFO设计!

异步FIFO设计可以说是数字IC设计工程师面试时必问的一个问题了&#xff0c;也是我们经常使用但是又往往被忽略的一个东西&#xff0c;今天就展开详细说一说不同深度&#xff08;2^N或者非2^N&#xff09;异步FIFO的设计思想&#xff1b; 一&#xff1a;2^N深度异步FIFO设计 1…

git和github学习

一、什么是git和github? 二、学会使用github desktop应用程序 初始使用&#xff1a; 一开始我们是新账户&#xff0c;里面是没有仓库的&#xff0c;需要手动创建一个仓库。此时&#xff0c;这个仓库是创建在本地仓库里面&#xff0c;需要用到push命令&#xff08;就是那个pub…

现代C++中的从头开始深度学习【2/8】:张量编程

一、说明 初学者文本&#xff1a;此文本需要入门级编程背景和对机器学习的基本了解。张量是在深度学习算法中表示数据的主要方式。它们广泛用于在算法执行期间实现输入、输出、参数和内部状态。 在这个故事中&#xff0c;我们将学习如何使用特征张量 API 来开发我们的C算法。具…

Android Studio实现简单ListView

效果图 MainActivity package com.example.listviewtest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.widget.ListView;import com.example.listviewtest.adapter.PartAdapter; import com.example.listviewtest.bean.PartB…

【Spring Cloud 六】Hystrix熔断

这里写目录标题 系列文章目录背景一、Hystrix是什么服务雪崩服务容错的相关概念熔断器降级超时控制限流 二、会什么要有Hystrix三、如何使用Hystrix进行熔断处理整体项目代码服务提供者pom文件yml配置文件启动类controller 服务消费者pom文件yml配置文件启动类feignhystrixcont…

网络安全(黑客)零基础入门

导语 什么是 Web 安全&#xff1f;我又该如何入门学习它呢&#xff1f;学习过程中又应注意哪些问题呢&#xff1f;... 或许你的心中有着这样的疑问、不过别着急&#xff0c;本文会为你一一解答这些问题。 正文 定义 Web 安全&#xff0c;顾名思义便是由保障 Web 应用能够持续…

Windows新版文件资源管理器经常在后台弹出的临时解决方案

禁用组策略自动刷新 运行gpedit.msc找到计算机配置->管理模板->系统->组策略找到 “关闭组策略的后台刷新”启用 参考 https://answers.microsoft.com/en-us/windows/forum/all/windows-11-most-recently-opened-explorer-window/26e097bd-1eba-4462-99bd-61597b5…