冒泡排序是一种简单的排序算法,它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把它们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
比较相邻元素 :从序列的第一个元素开始,比较它与下一个元素的大小关系。如果前一个元素大于后一个元素,则交换它们的位置。重复比较:
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
减少比较次数:
针对所有的元素重复以上的步骤,除了最后一个。每一轮循环结束后,最大的元素会被放到正确的位置。
终止条件:
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
示例
假设我们有一个数组 `[5, 3, 8, 4, 2]`,我们将按照冒泡排序的步骤进行排序:
第一轮
比较 `5` 和 `3`,交换位置:[3, 5, 8, 4, 2]
比较 `5` 和 `8`,不交换:[3, 5, 8, 4, 2]
比较 `8` 和 `4`,交换位置:[3, 5, 4, 8, 2]
比较 `8` 和 `2`,交换位置:[3, 5, 4, 2, 8]
第二轮
比较 `3` 和 `5`,不交换:[3, 5, 4, 2, 8]
比较 `5` 和 `4`,交换位置:[3, 4, 5, 2, 8]
比较 `5` 和 `2`,交换位置:[3, 4, 2, 5, 8]
比较 `5` 和 `8`,不交换:[3, 4, 2, 5, 8]
第三轮
比较 `3` 和 `4`,不交换:[3, 4, 2, 5, 8]
比较 `4` 和 `2`,交换位置:[3, 2, 4, 5, 8]
比较 `4` 和 `5`,不交换:[3, 2, 4, 5, 8]
比较 `5` 和 `8`,不交换:[3, 2, 4, 5, 8]
第四轮
比较 `3` 和 `2`,交换位置:[2, 3, 4, 5, 8]
比较 `3` 和 `4`,不交换:[2, 3, 4, 5, 8]
比较 `4` 和 `5`,不交换:[2, 3, 4, 5, 8]
比较 `5` 和 `8`,不交换:[2, 3, 4, 5, 8]
此时,数组已经完全排序,最终结果为 `[2, 3, 4, 5, 8]`。
时间复杂度
冒泡排序的时间复杂度为 \(O(n^2)\),其中 \(n\) 是序列的长度。在最坏的情况下,需要进行 \(n-1\) 轮比较和交换,每轮比较 \(n-i\) 次(其中 \(i\) 是当前轮次)。
稳定性
冒泡排序是稳定的排序算法,即相等的元素在排序后保持原来的相对顺序。
应用场景
冒泡排序适用于小规模数据的排序,或者在需要稳定排序且数据量不大的情况下使用。对于大规模数据,冒泡排序的效率较低,通常会被更高效的排序算法(如快速排序、归并排序)所取代。