JavaScript冒泡排序和插入排序的执行过程以及实现代码

319 阅读3分钟

冒泡排序和插入排序

所用知识点

for循环

  • 根据while练习的四要素引入for循环

      1. 循环变量初始值
      1. 循环的条件
      1. 循环体
      1. 循环变量自增自减运算
  • for循环开发中常见的作用是循环数组

    • 案例: 打印班级名单案例
    • 遍历数组
  • 循环的小结

    • for循环: 当如果明确了循环的次数的时候推荐使用for循环
    • while循环: 当不明确循环的次数的时候推荐使用while循环
  • 循环语句的跳出

    • break和continue

      • 说明区别

          1. break: 一般用于结果已经得到, 后续的循环不需要的时候可以使用
          1. continue: 一般用于排除或者跳过某一个选项的时候, 可以使用continue
  • 循环加强

    • 双层for循环嵌套
// 外层循环打印 第 n 天

    for (let i = 1; i <= 3; i++) {

      document.write(`第${i}天<br>`)

      // 里层循环打印 第几个单词

      for (let j = 1; j <= 5; j++) {

        document.write(`记住了第${j}个单词<br>`)

      }

    }
	- 在网页上打印出一个五行五列的星星
	- 在网页上打印出一个五行递增列的星星
	- 在网页上打印99乘法表

数组

  • 什么是数组? 为什么需要数组?

    • 存储班级所有人的姓名
    • 可以把多个数据存储到单个变量里面
  • 创建数组

    • 字面量
    • 构造函数(提一嘴)
// 1. 字面量声明数组

    // let arr = [1, 2, 'pink', true]

    // 2. 使用new Array 构造函数声明   了解

    // let arr = new Array(1, 2, 3, 4)

    // console.log(arr)
  • 操作数组

    • 数组本质是数据集合,使用无非就是增删改查

      • 数组[下标]
      • 数组[下标] = 新值
      • arr.push(新增的内容)

        • push可以实现一次性添加多个的效果, 推荐使用
      • arr.unshift(新增的内容)

      • arr.pop()

        • 每次只能删除一个,删末尾的
      • arr.shift()

        • 每次只能删除一个,删开头的
      • arr.splice(操作的下标,删除的个数)

  • 遍历数组


        /*

            1. 数组遍历是将数组中的元素全部访问一遍,可以利用for循环来实现,在for循环中让索引从0开始自增。

            2. 如果数组元素比较多时,计算数组元素的个数不太方便,这时候可以利用“数组名.length”来快速地获取数组长度。

        */

        var arr = [12, 33, 14, 44, 34, 55, 99, 78]

        // 利用for循环来实现

        for (var i = 0; i < arr.length; i++) {

            console.log(arr[i])

        }
- 访问数组里面的每一个数据 
- 依次访问
- 循环访问 for 
- 数组中的元素  arr[i]

排序

现在我们要开始对排序算法部分进行讲解,排序算法顾名思义,就是对一堆杂乱无章的数据按照一定的规则将它们有序地排列在一起。

在讲解排序算法时,大致分成两大类,如下图

QQ截图20230328011531.png

插入排序

  • 问: 假设现在有5个人,分别为 A、B、C、D 、E,它们的身高分别为 165、178、150、180、200,请你找出最高的那个人,并记录比较次数。

    • 答: 我们先用 A 跟 B 比较,得 B 比 A 高 ; 那我们就用 B 跟 C 比较,得 C 比 B 矮 ;继续用 B 与 D 比较,得 D 比 B 高 ;最后用 D 跟 E 比较,得 E 比 D 高。因此,最终得出 E 是这五个人里最高得,同时我们记下得比较次数为 4 次。
  • 思想

    • 一般人打扑克牌,整理牌的时候,都是按牌的大小(从小到大或者从大到小)整理牌的,那每摸一张新牌,就扫描自己的牌,把新牌插入到相应的位置。
    • 插入排序的工作原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
  • 方法

    • 第一个元素直接被认定成已排序

    • 从数组中取出下一个数字,与前面的所有元素进行比较

    • 如果该元素满足条件,便进行交换

    • 一直重复交换直到元素前面的数字不满足条件

    • 下标向后移一位,一直循环,直至最后一位元素不满足交换条件条件

    • 如图

      • 插入排序.gif
      • 黄色是已经排好顺序的,红色和绿色是正在进行交换的部分
    • 代码

// 示例代码:
	      var arr = [10, 23, 1, 3, 55, 34, 12]
	      // 外层循环,相当于决定数组需要进行几趟元素的交换
	      for (var i = 1; i < arr.length; i++) {
	        // 内层循环,相当于每趟的交换次数,同时在已排序的数组中从最后一个元素向第一个元素遍历,找到相应位置并插入。
	        for (var j = i; j > 0; j--) {
	          if (arr[j - 1] > arr[j]) {
	            var newNum = arr[j - 1];
	            arr[j - 1] = arr[j];
	            arr[j] = newNum
	          }
	        }
	      }
	      console.log(arr)

冒泡排序

  • 思想

    • 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法
    • 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
  • 原理图

    冒泡排序gif.gif

  • 代码


    let arr = [2, 4, 3, 5, 1]

    // for (let i = 0; i < arr.length - 1; i++) {

    //   for (let j = 0; j < arr.length - i - 1; j++) {

    //     // 开始交换 但是前提 第一个数大于第二个数才交换

    //     if (arr[j] > arr[j + 1]) {

    //       // 交换2个变量

    //       let temp = arr[j]

    //       arr[j] = arr[j + 1]

    //       arr[j + 1] = temp

    //     }

    //   }

    // }

    // arr.sort()  // 排序

    // sort 升序排列

    // arr.sort(function (a, b) {

    //   return a - b

    // })

    // sort() 降序

    arr.sort(function (a, b) {

      return b - a

    })

    console.log(arr)

  


    // let num1 = 10

    // let num2 = 20

    // let temp = num1

    // num1 = num2

    // num2 = temp

总结

两种方法在数据量小的时后使用是可以的,一旦数据量达到一定的数量,处理起来就很费时间

两种排序都有快速排序,章中讲解快速排序的原理以及代码