冒泡排序和双向冒泡排序 —— 前端 js 版

本文介绍了冒泡排序的基本概念和实现方式,并对其进行了优化。同时,讲解了双向冒泡排序的原理,指出在某些情况下双向冒泡排序可能更快,并给出了代码实现。在力扣平台上,这些排序算法都通过了测试。
摘要由CSDN通过智能技术生成

冒泡排序

冒泡排序理解

冒泡排序是基础的排序算法之一,效率非常低,但作为一名前端开发,掌握它还是必不可少的技能。
冒泡排序是将相邻两个元素进行比较,根据条件进行调换位置达到排序的目的。

冒泡排序实现

本例最大的数字放在了最右边,则下次遍历可少比较一次最右边的,本次需比较的次数:数组最大索引值 - 1(因为要比较 j + 1, j + 1 需小于等于数组最大索引值)- 遍历的次数

在力扣上通过排序测试时间如下:
冒泡排序时间

function maopao(nums) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = 0; j < nums.length - 1 - i; j++) {
      if (nums[j] > nums[j + 1]) {
        const temp = nums[j]
        nums[j] = nums[j + 1]
        nums[j + 1]= temp
      }
    }
  }
}
var e = JSON.parse(JSON.stringify(c))
maopao(e)
console.log(e);

冒泡排序优化

有可能在上面的遍历未结束之前,数组已经排序完成,所以当数组在一次内循环结束之后排序不变,则代表排序完成,可跳出遍历

在力扣上通过排序测试时间如下:
冒泡排序优化时间

function maopao2(nums) {
  for (let i = 0; i < nums.length; i++) {
    let flag = false
    for (let j = 0; j < nums.length - 1 - i; j++) {
      if (nums[j] > nums[j + 1]) {
        const temp = nums[j]
        nums[j] = nums[j + 1]
        nums[j + 1]= temp
        flag = true
      }
    }
    if (!flag) {
      break
    }
  }
}
var f = JSON.parse(JSON.stringify(c))
maopao2(f)
console.log(f);

双向冒泡排序

双向遍历,一个是把最大的放在最后边,一个是把最小的放在最左边。双向冒泡排序在大部分情况下会比普通优化冒泡速度快些。

在力扣上通过排序测试时间如下:
双向冒泡排序时间

双向冒泡代码实现

function maopao4(nums) {
  let left = 0, right = nums.length - 1
  for (let i = 0; i < nums.length; i++) {
    if (left >= right) { // 左侧大于等于右侧,意味着左侧大于等于一半的length,说明已经完成整个排序了
      break
    }
    let flag = false
    if (i % 2 ===0) { // 通过奇偶来区分从左向右,还是从右向左
      for (let j = left; j < right; j++) {
        if (nums[j] > nums[j + 1]) {
          const temp = nums[j]
          nums[j] = nums[j + 1]
          nums[j + 1]= temp
          flag = true
        }
      }
      right -- // 从左向右排序,最大的放在最右边,则最后边在下一轮不用参与排序,right --
    } else {
      for (let j = right; j > left; j--) {
        if (nums[j - 1] > nums[j]) {
          const temp = nums[j - 1]
          nums[j - 1] = nums[j]
          nums[j]= temp
          flag = true
        }
      }
      left ++ // 从右向左排序,最小的放在最左边,最左边最小在下一轮不用参与排序,left ++
    }
    if (!flag) { // 如果一轮里数据都没有变化,则说明排序完成,可终止排序
      break
    }
  }
}
var h = [5,1,1,2,0,0]
maopao4(h)
console.log(h);

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值