JavaScript 数据结构与算法十大经典排序算法-冒泡排序(一)

实现原理

简单来说就是实现的思想

  • 冒泡排序只会操作相邻的两个数据
  • 每次冒泡操作都会对相邻两个元素进行比较,看是否满足大小关系要求。如果不满足就让他俩互换
  • 一次冒泡会让至少一个元素移动到它应该再度位置,重复 n 次,就完成了 n 个数据的排序工作
特点
  • 优点:排序算法的基础,简单使用易于理解
  • 缺点:比较次数多,效率较低
实现
//冒泡排序(未优化)
const buddleSort = arr=>{
  let length = arr.length
  if ( length <=1 ) return
  // i < length - 1 是因为外层只需要 length-1 次就排好了,第 length 次比较是多余的。
  for ( let i=0; i<length-1; i++ ){
 	 // j < length - i - 1 是因为内层的 length-i-1 到 length-1 的位置已经排好了,不需要再比较一次。
    for (let j=0; j<length-i-1; j++){
      if (arr[j] > arr[j+1] ){
        const temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp
      }
    }
  }
}

突然发现自己好菜,这个代码乍一看没看懂。
上面代码实现方法是这样的(懂得直接跳过这段),数组两两对比会把大的那个往后排,这样第一次循环之后,数组中最大的会排到最后。所以内层循环for (let j=0; j<length-i-1; j++){ },在下一次循环时就可以少循环一次,以此类推,外层循环一次内层循环就少一个。这样每次外层循环对应内场循环就是length-i-1次。

优化:当某次冒泡操作已经没有数据交换时,说明已经到达完全有序,也就是已经排序完成,不用再继续执行后续的冒泡操作。

// 冒泡排序(已优化)
buddleSort = arr=>{
  let length = arr.length
  if ( length <=1 ) return
  // i < length - 1 是因为外层只需要 length-1 次就排好了,第 length 次比较是多余的。
  for ( let i=0; i<length-1; i++ ){
    let hasChange = false //标志代表是否某次排序数据没有交换,也就是代表排序已完成
    // j < length - i - 1 是因为内层的 length-i-1 到 length-1 的位置已经排好了,不需要再比较一次。
    for (let j=0; j<length-i-1; j++){
      if (arr[j] > arr[j+1] ){
        const temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp

        hasChange = true //这个时候是有数据交换的
      }
    }

    if(!hasChange) break // 如果false 说明内层循环在某次数据对比时没有进行数据交换过,这个时候就可以提前退出循环,排序已经完成
  }
}

以上就是冒泡排序的实现方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值