首页 > 编程语言 >JavaScript冒泡排序+Vue可视化冒泡动画

JavaScript冒泡排序+Vue可视化冒泡动画

时间:2022-12-19 09:12:04浏览次数:52  
标签:arr Vue JavaScript 冒泡排序 let len 元素 排序

1.gif

冒泡排序(Bubble Sort)算是前端最简单的算法,也是最经典的排序算法了。网上JavaScript版本的冒泡排序很多,今天用Vue实现一个动态的可视化冒泡排序。

01、JavaScript冒泡排序

冒泡排序原理也比较简单,就是相邻元素两两比较排序,把大的元素冒泡排序到后面,递归所有相邻元素组合完成排序。

1.1、原理

有一个无序数组:let arr = [100, 5, 6, 17, 3, 1],长度为len=6

  • 、从第一位元素100(0索引)开始,比较相邻arr[0]、arr[1]元素的大小,大的排后面,如果arr[0]>arr[1]则交换值位置。
  • 、如下图,依次相邻元素比较、交换,一轮完成后,最大元素就到了最右边了。这个过程中,最大的元素(最大的泡泡)就像冒泡一样到了末尾。

image

  • ③、然后继续对剩下的前面len-1=5个元素重复上述步骤,直到只剩下一个元素。这是一个递归的过程,递归到第一个元素,就完成了冒泡排序。

image

冒泡排序的动画过程如下图,排序过程很直观,一目了然,下一章节也实现一个跟好的。

1.2、JavaScript实现

经典冒泡排序算法,用两个for循环来实现所有元素的两两对比排序。统计了一下排序次数,一共比较了15次。冒泡排序的时间复杂度是O(n^2),这是最大值,最小为O(n)。

//经典冒泡排序算法
//从小到大冒泡排序
let arr = [100, 5, 6, 17, 3, 1];
let count=0; //计数器
function bubbleSort(arr) {
    const len = arr.length;
    let t;count=0;
    for (let i = 0; i < len - 1; i++) {
        for (let j = 0; j < len - i - 1; j++) {
            count++;
            //比较相邻两个元素
            if (arr[j] > arr[j + 1]) {
                //交换两个元素,大的往后排列
                t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
    return arr;
}
console.log(bubbleSort(arr),"比较次数:",count);
//[1, 3, 5, 6, 17, 100] '比较次数:' 15

上面代码中交换两个元素位置的时候,用了一个中间变量(t),可以改进一下。用一个解构赋值来交换值,就不用额外的一个中间变量(t)了。

let arr = [100, 5, 6, 17, 3, 1];
function bubbleSort(arr) {
    const len = arr.length;
    for (let i = 0; i < len - 1; i++) {
        for (let j = 0; j < len - i - 1; j++) {
            //比较相邻两个元素
            if (arr[j] > arr[j + 1]) {
                //用结构赋值进行交换
                [arr[j], arr[j + 1]] = [arr[j+1], arr[j]];
            }
        }
    }
    return arr;
}
console.log(bubbleSort(arr));
//[1, 3, 5, 6, 17, 100]

02、Vue实现一个冒泡动画

用Vue来实现一个可视化的冒泡排序,用Vue就不用去操作Dom了,只需要要处理好排序过程即可,因此首先要对排序过程进行改造。

2.1、排序过程改造

上一章节的排序是连续执行,瞬间完成的。要实现可视化的排序效果,每一个排序步骤之间得有间隔,给过渡动画留时间。就需要把排序的每一个步骤拆开,可以单独控制执行。

  • 定义一个排序对象SortItem,包装待排序元素,用于可视化展示,属性包括排序值、泡泡大小、泡泡颜色。
  • 用上面的排序对象SortItem,生成排序对象集合,正式排序步骤中用该集合。方法的参数为排序元素字符串,空格隔开,如“9 100 6 17 3 1”。
//定义一个排序对象,包装待排序元素
function SortItem(n) {
    this.value = n;
    this.size = 30 + n + 'px';  //泡泡大小,初试大小30px
    this.color = bubbleColor.default;
}
//生成排序对象集合,参数为排序元素字符串,如“9 100 6 17 3 1”
function generateSortItems(arrStr) {
    let arrItems = [];
    let arr = arrStr.trim().split(' ');
    for (let i = 0; i < arr.length; i++) {
        arrItems[i] = new SortItem(window.parseInt(arr[i]));
    }
    return arrItems;
}

泡泡列表展示效果如下:

image.png

  • 然后就是排序过程了,对排序对象集合进行遍历,把每一次排序操作包装成一个(闭包)函数,放到一个集合里,后面就可自定义调用执行了。
  • 先是用集合实现了一遍,发现这个场景用迭代器Generator更优雅,马上重构,上迭代器!每次迭代yield返回排序的函数。
//迭代器实现排序步骤的拆分
function* generateSortFunc(items) {
  const len = items.length;
  for (let i = 0; i < len - 1; i++) {
    for (let j = 0; j < len - i - 1; j++) {
      //迭代器返回的是一个(闭包)函数,为每一个排序步骤
      yield () => {
        //执行排序前重置泡泡颜色
        resetColor(items);
        //正在排序的泡泡元素高亮
        items[j].color = bubbleColor.inprocess;
        items[j + 1].color = bubbleColor.inprocess;
        if (items[j].value > items[j + 1].value) {
          [items[j], items[j + 1]] = [items[j + 1], items[j]];
        }
      }
    }
    //完成一轮排序,末尾泡泡元素标记为完成态颜色
    items[len - i - 1].color = bubbleColor.completed;
  }
}

标签:arr,Vue,JavaScript,冒泡排序,let,len,元素,排序
From: https://www.cnblogs.com/anding/p/16989579.html

相关文章

  • Vue 中自定义事件
    Vue中自定义事件1:自定义说明/*组件的自定义事件一种组件间通信的方式,适用于:子组件===>父组件使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事......
  • vue3+ts项目中无法识别vue文件
    在vue3+ts的项目中,如果缺少声明文件,会出现类似于下面的报错。只需要在src的根目录下创建一个声明文件:env.d.ts,就可以解决这个报错。代码内容如下:declaremodule"*.......
  • 关于 'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件 的处
    关于npmrunserve之后 'vue-cli-service'不是内部或外部命令,也不是可运行的程序或批处理文件一、安装node.js去官网安装Node.js(地址:https://nodejs.org/en/): ......
  • 学习vue3组件事件时,思维发散(溜号)的感悟
    https://cn.vuejs.org/guide/components/events.html#usage-with-v-model 老婆在客厅看,英文、日文影片(或动漫) 我就溜号了,想起英文发音和日文发音(包括中文发音)的差异,......
  • 实用HTML,CSS和JavaScript速查表--转载
    速查表是帮你记住东西的有效工具。Web设计师和开发者经常使用的快捷键简表会使他们在网上的工作效率大大提高。事实上,速查表就是来帮助我们把日常中最常用到的信息聚集起来......
  • vue基础(3)
    过滤器:filterVue.js允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以使用在2个地方:{{}}插值和v-bind表达式(后者从2.1.0+开始支持)过滤器分为:全局过......
  • vue知识点
    第一章、vue的指令与过滤器1.内容渲染指令1.1.v-text:缺点会覆盖元素内部原有的内容1.2.{{}}:插值表达式,只是内容的占位符不会覆盖原来的内容1.3.v-html:可以带有标......
  • javaScript随机图片
    <scripttype="text/javascript">//<!CDATA[varpic=[];pic[0]="链接";pic[1]="链接";pic[2]="链接";pic[3]="链接";varr......
  • 冒泡排序相关知识总结
    轮数表示冒泡排序外层循环的次数,次数表示交换次数。设排列为\(w\),冒泡排序的轮数为\(\max_{i=1}^{n}(i-w_i)\).因为如果\(i>w_i\),那么这个数每一轮会向目的地......
  • Vue3 - Vite 安装与创建 vue3 项目
    前言为什么使用vite(官方解释):https://vitejs.cn/guide/why.html它是一款由尤雨溪开发的新工具,旨在代替webpack,利用浏览器现已支持ES6的基础,遇到import会发送一个......