排序算法 - 冒泡排序

#冒泡排序

例如:[3,2,4,1]

第一遍:[2,3,1,4]

第二遍:[2,1,3,4]

第三遍:[1,2,3,4] //结束

基础版

for(let i = 0;i<arr.length - 1;i++){//控制比较轮次,一共 n-1 趟
  for(let j=0;j<arr.length - 1 - i;j++){//控制两个挨着的元素进行比较
    if(arr[j] > arr[j+1]){
      const temp = arr[j];
      arr[j] = arr[j+1];
      arr[j+1] = temp;
    }
  }
}

优化版 :
说明:判断本次循环是否进行了交换
  true:则说明还排序完成
  false:则说明排序已经完成,没必要继续循环下去了

for (let i = 0; i < arr.length - 1; i++) {
  const isSorted  = false;//有序标记,每一轮的初始是false
  for (let j = 0; j < arr.length - 1 - i; j++) {
    if (arr[j + 1] < arr[j]) {
      isSorted  = true;//有元素交换,所以不是有序,标记变为true
      const temp = arr[j];
      arr[j] = arr[j+1];
      arr[j+1] = temp;
    }
  }
  //一趟下来是否发生位置交换,如果没有交换直接跳出大循环
  if(isSorted )
  break;//结束循环
}

升级版:
例如:[3,4,2,1,5,6,7,8]
 前半部分有序,后半部分无序,会导致白白进行比较

//记录最后一次交换的位置
let lastExchangeIndex = 0;
//无序数列的边界,每次比较只需要比到这里为止
let sortBorder = arr.length - 1;

for (let i = 0; i < arr.length - 1; i++) {
  const isSorted  = false;//有序标记,每一轮的初始是false
  for (let j = 0; j < sortBorder; j++) {
    if (arr[j + 1] < arr[j]) {
      isSorted  = true;//有元素交换,所以不是有序,标记变为true
      const temp = arr[j];
      arr[j] = arr[j+1];
      arr[j+1] = temp;
      lastExchangeIndex = j;
    }
  }
  sortBorder = lastExchangeIndex
  //一趟下来是否发生位置交换,如果没有交换直接跳出大循环
  if(isSorted )
  break;//结束循环
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值