冒泡排序(Bubble sort)
Posted jeffrey-yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序(Bubble sort)相关的知识,希望对你有一定的参考价值。
冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻的项目,如果它们的顺序错误则交换它们。 重复遍历列表,直到不需要交换,这表示列表已排序。 该算法是一种比较排序,以较小或较大元素“冒泡”到列表顶部的方式命名。 尽管算法很简单,但即使与插入排序相比,它对于大多数问题来说太慢而且不切实际。如果输入大部分是按顺序排列的,并且某些无序元素几乎就位,则冒泡排序可能是实用的。
如果列表中有n个数据,则在第一轮遍历中,需要进行n - 1次数据比较。遍历的原则为:比较相邻数据,若A[i] > A[i + 1](A为列表,i为索引),则发生数据交换。然后继续比较A[i + 1]和A[i + 2],直至A[n - 2]和A[n - 1]。最终,最大的元素会通过n - 1次比较,下沉到最后一个元素。按照这种思路,进行第二轮比较,但只比较到A[ n - 3]和A[n - 2](A[n - 1]已经在第一轮遍历后确定为最大元素),则第二轮需要比较n - 2次。最终,总的比较次数为 n -1 + n - 2 + n - 3 + ... + 1,结果为(frac{1}{2}n^2-frac{1}{2}n),其时间复杂度为O((n^2))。
算法实现
下面来用Python代码来简单的实现冒泡排序算法。思路很简单,第一层循环表示总共需要进行几层遍历,第一层遍历将最大的数转移到列表最后,第二次遍历将第二大的数转移到列表倒数第二的位置。总共循环n - 1次。内层循环依次比较相邻的数据大小,若靠前的数据比考后的数据大,则进行交换。
def bubble_sort(a_list):
for pass_num in range(len(a_list) - 1, 0, -1):
for i in range(pass_num):
if a_list[i] > a_list[i + 1]:
temp = a_list[i]
a_list[i] = a_list[i + 1]
a_list[i + 1] = temp
算法改进
冒泡排序通常认为是最低效的排序算法,因为在数据的最终位置确认前,都需要进行比较和交换。冒泡排序唯一的优势是若待排序列表已经排好序,则在第一轮遍历中若没有发生数据交换,则可以提前停止排序算法,将时间复杂度降为O(n)。下面是算法实现:和上面唯一不同的时,在每一轮遍历开始时,我们先用exchanegd变量假设该轮遍历未发生交换。在实际遍历过程中,若发生交换,则更改变量值,在该轮遍历结束时,判断本轮次遍历是否发生交换,若没有发生,则说明已经排序完毕。
def short_bubble_sort(a_list):
for pass_num in range(len(a_list) - 1, 0, -1):
exchanged = False
for i in range(pass_num):
if a_list[i] > a_list[i + 1]:
temp = a_list[i]
a_list[i] = a_list[i + 1]
a_list[i + 1] = temp
exchanged = True
if not exchanged:
break
总结:冒泡排序的效率算是所有排序算法中最低的,但若存在已经排序好的列表,则可以提前结束排序。值得注意的是,冒泡排序默认是稳定的排序算法,但若在比较的时候使用>=而不是>号时,相等的元素也发生了数据交换,从而稳定的算法变得不再稳定。可以查看排序算法的稳定性以详细了解。
以上是关于冒泡排序(Bubble sort)的主要内容,如果未能解决你的问题,请参考以下文章