《算法零基础》冒泡排序(概念篇)
一、引言
冒泡排序(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次操作,但冒泡排序仍需要大约一百秒才能完成。
但是,它的外层循环是可以提前终止的,例如,假设一开始所有数字都是升序的,那么在首轮「比较」的时候没有发生任何的「交换」,那么后面也就不需要继续进行「比较」了,直接跳出外层循环,算法提前终止。
「改进思路」如果我们通过内部循环完全不交换,这意味着数组已经排好序,我们可以在这个点上停止算法。