你应该知道的排序算法-冒泡排序

656 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

想必大家在学习各种编程语言时写的第一行代码都是hello world!,学习的第一个排序算法也往往是经典的冒泡排序

冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 ——百度百科

分析

分析这个排序的原理,除了看一些基本的文字性介绍,最直观的还是通过动画去演示算法的过程.

原理动画演示图

1_.gif

步骤分析:

  1. 索引0开始依次比较相邻的两个元素(a和b);
  2. 如果这两个元素存在比较关系,则进行交换。(例如 a > b, 则a, b交换)
  3. 重复步骤1和步骤2,直到将最大的元素移动到数组的末尾(称之为一次大循环)
  4. 第1次大循环之后会将第1大的元素移动到length - 1的位置,整体大循环的次数也对应减少1,重复步骤1,步骤2,完成排序.

代码实现

function bubbleSort(arr: number[]) {
  // 定义大循环次数
  let maxCount = arr.length - 1;
  for(; maxCount > 0; maxCount--) {
    for(let i = 0; i < maxCount; i++) {
      // 进入小循环,执行步骤1,步骤2
      const nextIndex = i + 1;
      if (arr[i] > arr[nextIndex]) {
        const temp = arr[i];
        arr[i] = arr[nextIndex];
        arr[nextIndex] = temp;
      }
    }
  }
  return arr;
}

这样动画演示的算法示例代码就完成了,但是还有优化的空间,当进行n次排序后(n小于maxCount且大于0), 已经变成了有序的数组,则就不需要再重复步骤去排序了。

优化代码

function bubbleSort(arr: number[]) {
  // 大循环次数
  let maxCount = arr.length - 1;
  // 是否需要继续排序标识符
  let flag = true;
  for(; maxCount > 0 && flag; maxCount--) {
    flag = false;
    for(let i = 0; i < maxCount; i++) {
      const nextIndex = i + 1;
      if (arr[i] > arr[nextIndex]) {
        const temp = arr[i];
        arr[i] = arr[nextIndex];
        arr[nextIndex] = temp;
        // 如果交换,则表示还需要继续重复步骤
        flag = true;
      }
    }
  }
  return arr;
}

思考总结

至此,一个冒泡排序算法就实现了,虽然在基础上添加了优化,但它的平均时间复杂度是O(n^2),所以它的性能耗时还是很差的,平时工作开发中也就很少会用到。

源码地址,感兴趣的小伙伴可以看下吼~

更多推荐

# JavaScript浅尝二叉搜索树(BST)

关于斐波那契数列,你会几种呀!

如何用JS实现单链表?

f616ca9fc981d5e6214c5ef1a34fedf9.jpeg