经典排序算法1-冒泡排序(Python实现)

经典排序算法之冒泡排序

冒泡排序法又称为交换排序法,是从观察水中气泡变化构思而成的,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后在进行下一个元素的比较,就仿佛气泡逐渐从水底冒升到水面一样。如此扫描过一次之后,就可以确保最后一个元素位于正确的顺序。接着逐步进行第二次扫描,直到完成所有元素的排序关系为止。

我们以10, 8, 44, 9, 12, 37, 21, 5这一组数为例:
从小到大排序:
首先会比较10和8两个数,明显10>8,所以交换10和8的位置,即为:
8,10,44,9,12,37,21,5
第二次:
用10与44比较,因为10<44成立,所以不进行位置交换。
第三次:
用44和9比较,44>9,交换位置,即为:
8,10,9,44,12,37,21,5

重复以上步骤,在一次遍历过后,数组应该变成如下:
8,10,9,12,37,21,5,44
可以看到,最大值44已经交换到数组最后位置。

代码如下:

list_chaos = [10, 8, 44, 9, 12, 37, 21, 5]


def sort_bubble(data):
    length = len(data)
    for i in range(length):
        for j in range(length - i - 1):  #外圈i每循环一次,即表示有i个元素以完成排序,因此这里需要减掉
            if data[j] > data[j + 1]:
                data[j], data[j + 1] = data[j + 1], data[j]  #如果j>j+1,即交换两个元素的位置
        print(data)


sort_bubble(list_chaos)

我们打印出每次外圈循环完成之后数组的变化:
[8, 10, 9, 12, 37, 21, 5, 44]
[8, 9, 10, 12, 21, 5, 37, 44]
[8, 9, 10, 12, 5, 21, 37, 44]
[8, 9, 10, 5, 12, 21, 37, 44]
[8, 9, 5, 10, 12, 21, 37, 44]
[8, 5, 9, 10, 12, 21, 37, 44]
[5, 8, 9, 10, 12, 21, 37, 44]
[5, 8, 9, 10, 12, 21, 37, 44]

可以看出,每次循环过后,最大的元素都逐渐排向了数组的末尾,循环结束数组也完成了排序。

冒泡法分析

  • 最坏情况和平均情况需比较(n-1)+(n-2)+(n-3)+…+3+2+1 = (n(n-1))/2次,时间复杂度为O(n^2),最好的情况只需完成一次扫描,发现没有执行的交换操作,就表示排序已经完成,所以只做了n-1次比较,时间复杂度为O(n)。
  • 由于冒泡排序是相邻两个数组相互比较和对调,并不会更改其原本排序的顺序,因此是稳定排序法。
  • 只需要一个额外的空间,所以空间复杂度为最佳
  • 此排序法适用于数据量小或有部分数据已经排过序的情况。

猜你喜欢

转载自blog.csdn.net/airenKKK/article/details/89438385