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

冒泡排序

冒泡排序理解

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

冒泡排序实现

本例最大的数字放在了最右边,则下次遍历可少比较一次最右边的,本次需比较的次数:数组最大索引值 - 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);

猜你喜欢

转载自blog.csdn.net/hulingyua/article/details/109030846