Day05 冒泡排序(概念篇)

107 阅读3分钟

《算法零基础》冒泡排序(概念篇)

一、引言

​ 冒泡排序(Bubble Sort)是一种简单的排序算法,通过多次比较和交换相邻的元素,将数组中的元素按升序或降序排列。

二、算法思想

​ 冒泡排序的基本思想是:每次遍历数组,比较相邻的两个元素,如果它们的顺序错误,就将它们交换,直到数组中的所有元素都被遍历过。

​ 具体的算法步骤如下:

​ 第一步、遍历数组的第一个元素到最后一个元素。

​ 第二步、对每一个元素,与其后一个元素进行比较。

​ 第三步、如果顺序错误,就将它们交换。

​ 重复上述步骤,直到数组中的所有元素都被遍历过至少一次。

三、动图演示

​ 首先需要将「第一个元素」和「第二个元素」进行「比较」,如果前者大于后者,则进行「交换」,然后再比较「第二个元素」和「第三个元素」,以此类推,直到「最大的那个元素」被移动到「最后的位置」。

  然后,进行第二轮「比较」,直到「次大的那个元素」被移动到「倒数第二的位置」。

  最后,经过一定轮次的「比较」和「交换」之后,一定可以保证所有元素都是「升序」排列的。

四、算法分析

1、时间复杂度

​ 我们假设「比较」和「交换」的时间复杂度为O(1)(为什么这里说假设,因为有可能要「比较」的两个元素本身是数组,并且是不定长的,所以只有当系统内置类型,我们才能说这两个操作是O(1)的)。

​ 「 冒泡排序 」中有两个嵌套循环。

​ 外循环正好运行n−1次迭代。 但内部循环运行变得越来越短:

  当i=0,内层循环n−1次「比较」操作。

  当i=1,内层循环n−2次「比较」操作。

  当i=2,内层循环n−3次「比较」操作。

  ……

  当i=n−2,内层循环1次「比较」操作。

  当i=n−1,内层循环0次「比较」操作。

​ 因此,总「比较」次数如下:(n−1)+(n−2)+...+1+0=n(n−1)/2,总的时间复杂度为:O(n^2)。

2、空间复杂度

​ 由于算法在执行过程中,只有「交换」变量时候采用了临时变量的方式,而其它没有采用任何的额外空间,所以空间复杂度为O(1)。

五、算法的优点

​ 1. 简单易懂:冒泡排序的算法思想非常简单,容易理解和实现。

​ 2. 稳定排序:冒泡排序是一种稳定的排序算法,即在排序过程中不会改变相同元素的相对顺序。

六、算法的缺点

​ 1. 效率较低:由于需要进行多次比较和交换,冒泡排序在处理大规模数据时效率较低。

​ 2. 排序速度慢:对于大型数组,冒泡排序的时间复杂度较高,导致排序速度较慢。

七、优化方案

​ 「 冒泡排序 」在众多排序算法中效率较低,时间复杂度为O(n^2)。

   想象一下,当有n=100000个数字。 即使我们的计算机速度超快,并且可以在 1 秒内计算10^8次操作,但冒泡排序仍需要大约一百秒才能完成。

  但是,它的外层循环是可以提前终止的,例如,假设一开始所有数字都是升序的,那么在首轮「比较」的时候没有发生任何的「交换」,那么后面也就不需要继续进行「比较」了,直接跳出外层循环,算法提前终止。

​ 「改进思路」如果我们通过内部循环完全不交换,这意味着数组已经排好序,我们可以在这个点上停止算法。