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

系列文章目录

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


文章目录


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]的位置;

5 25 15 7 19 12 26 17 6 13

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

5 6 15 7 19 12 26 17 25 13

...

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

5 6 7 12 13 15 17 19 25 26

2、动画演示原理

3、代码实现

javascript 复制代码
<!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、当内层第一数就是最小值,不需要生成临时变量,也不需要与自己交换位置

javascript 复制代码
		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实现选择排序的动画效果(第二部分的动画效果图)

html 复制代码
<!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>
相关推荐
Q_w774216 分钟前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录
昨天;明天。今天。27 分钟前
案例-任务清单
前端·javascript·css
一丝晨光1 小时前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
Front思1 小时前
vue使用高德地图
javascript·vue.js·ecmascript
惜.己2 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
长天一色3 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2343 小时前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
读心悦3 小时前
如何在 Axios 中封装事件中心EventEmitter
javascript·http
神之王楠3 小时前
如何通过js加载css和html
javascript·css·html
余生H4 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈