算法-冒泡排序及优化

冒泡算法的原理:

升序冒泡:
两次循环,相邻元素两两比较,如果前面的大于后面的就交换位置

降序冒泡:
两次循环,相邻元素两两比较,如果前面的小于后面的就交换位置

js实现:

// 升序冒泡
function maopao(arr){
  const array = [...arr]
  for(let i = 0, len = array.length; i < len - 1; i++){
    for(let j = i + 1; j < len; j++) {
      if (array[i] > array[j]) {
        let temp = array[i]
        array[i] = array[j]
        array[j] = temp
      }
    }
  }
  return array
}
6782944-1e575744c1061b61.png
image.png

看起来没问题,不过一般生产环境都不用这个,原因是效率低下,冒泡排序在平均和最坏情况下的时间复杂度都是 O(n^2),最好情况下都是 O(n),空间复杂度是 O(1)。因为就算你给一个已经排好序的数组,如[1,2,3,4,5,6] 它也会走一遍流程,白白浪费资源。所以有没有什么好的解决方法呢?

答案是肯定有的:

加个标识,如果已经排好序了就直接跳出循环。

优化版:

function maopao(arr){
  const array = [...arr]
  let isOk = true
  for(let i = 0, len = array.length; i < len - 1; i++){
    for(let j = i + 1; j < len; j++) {
      if (array[i] > array[j]) {
        let temp = array[i]
        array[i] = array[j]
        array[j] = temp
        isOk = false
      }
    }
    if(isOk){
      break
    }
  }
  return array
}

测试:
数组:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

6782944-9de217e0ac393298.png
image.png

从测试结果来看:
普通冒泡排序时间:0.044ms
优化后冒泡排序时间:0.018ms

猜你喜欢

转载自blog.csdn.net/weixin_34025051/article/details/88230763
今日推荐