Python | 数据结构 - 冒泡排序和选择排序

liftword22小时前技术文章5

排序算法比较

排序算法

平均时间复杂度

最坏时间复杂度

空间复杂度

是否稳定

冒泡排序

O(n2)

O(n2)

O(1)

选择排序

O(n2)

O(n2)

O(1)

不是

插入排序

O(n2)

O(n2)

O(1)

希尔排序

O(n1.3)

O(n2)

O(1)

不是

快速排序

O(n log n)

O(n2)

O(log n)

不是

归并排序

O(n log n)

O(n log n)

O(n)

注:希尔排序的时间复杂度与其增量序列有关,具体数值存疑,这里仅供参考。

冒泡排序(Bubble sort)

冒泡排序是将相邻的数据两两比较,让较大的值向一个方向移动,经过有限多次移动后,即可实现排序操作。

首先,将乱序序列中的最大值找出,逐一移动到序列最后的位置:

alist = [3, 8, 5, 7, 6]
def bubble_sort(alist):
    # 找最大值的方式是通过对列表中的元素进行两两比较,值大的元素逐步向后移动
    # 序列中有n个元素,两两比较的话,需要比较n-1次
    for i in range(len(alist) - 1):    # 循环n-1次,控制两两比较的次数
        if alist[i] > alist[i + 1]:    # 如果前面的元素大于后面的元素,交换两个元素的位置;如果后面的元素大于前面的元素,则不作任何操作
            alist[i], alist[i + 1] = alist[i + 1], alist[i]
    return alist
print(bubble_sort(alist))    # [3, 5, 7, 6, 8]

我们发现上述代码已经可以将序列中的最大值放置到合适的位置。然后我们就可以将上述操作继续作用到剩下的 n-1 个元素对应的新序列,则就可以将者 n-1 个元素对应的最大值放置到第 n-1 个元素的最后位置。

结论:发现如果将上述的操作逐步的作用 n-1 次就可以将整个序列变成有序的。

alist = [3, 8, 5, 7, 6]
def bubble_sort(alist):
    for j in range(len(alist) - 1):    # 外层循环次数递增,内层循环次数递减
        for i in range(len(alist) - 1 -j):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]
    return alist
print(bubble_sort(alist))    # [3, 5, 6, 7, 8]
print(bubble_sort([]))    # []
print(bubble_sort([1]))    # [1]

选择排序(Selection sort)

选择排序是依次将最大值找到,然后将其放在最后位置。

同样地,我们先试着将最大的元素放到最后。乱序序列中的元素两两比较,找出最大值,然后直接将最大值放置到序列最后的位置,也就是将最大值直接和最后一个元素交换位置:

alist = [3, 8, 5, 7, 6]
def selection_sort(alist):
    max_index = 0    # 最大值元素的下标,一开始假设下标为0的元素为最大值
    for i in range(1, len(alist)):
        if alist[max_index] < alist[i]:
            max_index = i
    # 循环结束后max_index就一定是最大值的下标
    alist[max_index], alist[len(alist) - 1] = alist[len(alist) - 1], alist[max_index]
    return alist
print(selection_sort(alist))    # [3, 6, 5, 7, 8]

将上面的步骤重复作用 n - 1 次即可:

alist = [3, 8, 5, 7, 6]
def selection_sort(alist):
    for j in range(len(alist) - 1):
        max_index = 0
        for i in range(1, len(alist) - j):
            if alist[max_index] < alist[i]:
                max_index = i
        alist[max_index], alist[len(alist) - 1 - j] = alist[len(alist) - 1 - j], alist[max_index]
    return alist
print(selection_sort(alist))    # [3, 5, 6, 7, 8]

相关文章

Python数据可视化工具画图(八)(气泡图)

概述在《Python数据可视化工具画图(七)(热力图)》中讲述了如何通过python画热力图,本文讲述如何通过python画气泡图。matplotlib安装方法:pip install matplot...

数据可视化:探索气泡图(bubble charts)的力量

气泡图(bubble charts),也称为泡泡图,是展示数据的最引人注目的方式之一。它展示了前两个信息部分之间的关系。此外,它还突出显示了另一个重要部分,这个部分不总是直接依赖于前两个部分。当试图检...

探索Plotly:Python中的强大交互式图表库

Python的开源图形库Plotly (一)plotly 是一个交互式、开源、基于浏览器的 Python 图形库。plotly 图形库可制作交互式、出版质量的图形。包括制作线图、散点图、面积图、条形图...

如何用Python实现冒泡排序算法

一、冒泡排序的原理简介冒泡排序(Bubble Sort)是一种简单的排序算法,其核心思想是通过不断比较相邻元素并交换位置,将较大的元素逐渐“浮”到数组的末尾,就像气泡上浮一样。它的主要特点:时间复杂度...

Python实现冒泡排序

''' 冒泡排序原理:比较列表中相邻的两个元素大小,如果第2个元素比第1个元素大,就交换它俩的位置,从列表的开始到结尾, 依次对每一组相邻的2个元素都进行比较,这样最大的元素就...

一文解读Python嵌套循环实现冒泡排序

冒泡排序是数据结构中的一种经典算法,手工地实现冒泡排序,对于锻炼自己的编程逻辑有很大的帮助,本节就带领大家用循环结构实现冒泡排序算法。冒泡排序算法的实现思想遵循以下几步:1、比较相邻的元素,如果第一个...