33、数据结构与算法Python:冒泡排序和选择排序算法及分析

排序:冒泡排序Bubble Sort

冒泡排序的算法思路在于对无序表进行多趟比较交换,

每趟包括了多次两两相邻比较, 并将逆序的数据项互换位置, 最终能将本趟的最大项就位

经过n-1趟比较交换, 实现整表排序

每趟的过程类似于“气泡”在水中不断上浮到水面的经过

第1趟比较交换, 共有n-1对相邻数据进行比较

一旦经过最大项,则最大项会一路交换到达最后一项

第2趟比较交换时, 最大项已经就位, 需要排序的数据减少为n-1, 共有n-2对相邻数据进行比较

直到第n-1趟完成后, 最小项一定在列表首位, 就无需再处理了。

冒泡排序:第1趟

*

冒泡排序:代码

def bubbleSort(alist):
    for passnum in range(len(alist) - 1, 0, -1):
        for i in range(passnum):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubbleSort(alist)
print(alist)

冒泡排序:算法分析

无序表初始数据项的排列状况对冒泡排序没有影响

算法过程总需要n-1趟, 随着趟数的增加, 比对次数逐步从n-1减少到1, 并包括可能发生的数据项交换。

比对次数是1~ n-1的累加:

*

比对的时间复杂度是O(n^2)

关于交换次数, 时间复杂度也是O(n^2),通常每次交换包括3次赋值

最好的情况是列表在排序前已经有序, 交换次数为0

最差的情况是每次比对都要进行交换, 交换次数等于比对次数

平均情况则是最差情况的一半

冒泡排序通常作为时间效率较差的排序算法, 来作为其它算法的对比基准。

其效率主要差在每个数据项在找到其最终位置之前,

必须要经过多次比对和交换, 其中大部分的操作是无效的。

但有一点优势, 就是无需任何额外的存储空间开销。

冒泡排序:性能改进

另外, 通过监测每趟比对是否发生过交换, 可以提前确定排序是否完成

这也是其它多数排序算法无法做到的

如果某趟比对没有发生任何交换, 说明列表已经排好序, 可以提前结束算法

冒泡排序:性能改进代码

def shortBubbleSort(alist):
    exchanges = True
    passnum = len(alist)-1

    while passnum > 0 and exchanges:
        exchanges = False
        for i in range(passnum):
            if alist[i] > alist[i + 1]:
                exchanges = True
                alist[i], alist[i + 1] = alist[i + 1], alist[i]
        passnum = passnum-1
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
shortBubbleSort(alist)
print(alist)

选择排序Selection Sort

选择排序对冒泡排序进行了改进, 保留了其基本的多趟比对思路, 每趟都使当前最大项就位。

但选择排序对交换进行了削减, 相比起冒泡排序进行多次交换, 每趟仅进行1次交换, 记录最大项的所在位置, 最后再跟本趟最后一项交换

选择排序的时间复杂度比冒泡排序稍优比对次数不变,还是O(n^2),交换次数则减少为O(n)

*

选择排序:代码

def selectionSort(alist):
    for fillslot in range(len(alist)-1, 0, -1):
        positionOfMax=0
        for location in range(1, fillslot+1):
            if alist[location]>alist[positionOfMax]:
                positionOfMax = location
        alist[fillslot], alist[positionOfMax] = alist[positionOfMax], alist[fillslot]

alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
selectionSort(alist)
print(alist)

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: