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

createh53周前 (05-04)技术教程8

排序算法比较

排序算法

平均时间复杂度

最坏时间复杂度

空间复杂度

是否稳定

冒泡排序

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]

相关文章

C++ 初学阶段-冒泡法排序(c++冒泡排序模板)

C++ 初学阶段-冒泡法排序(c++冒泡排序模板)

#头条创作挑战赛#学程序重要的思维,冒泡法排序冒泡法排序,从第一个数值开始分别与后面的数值对比大小。大与就互换位置,直到换到最后一个数字。排序前数组:10,47,3,82,55,90,38,60,21...

冒泡、插入、选择排序(C语言)(c语言冒泡排序需要注意什么)

以下排序算法默认从小到大的升序排序。冒泡排序思路从数组的第一个数a[0]开始,向后遍历,每次比较a[i]和a[i+1]的值若a[i]大于a[i+1],就交换两个位置的数的值。重复上述1和2的操作至a[...

常用排序算法:冒泡排序,快速排序

在生活中,我们离不开排序。例如上体育课时,同学们会按照身高顺序进行排队;又如每一场考试后,老师会按照考试成绩排名次。在编程的世界中,应用到排序的场景也比比皆是。例如当开发一个学生 管理系统时,需要按照...

冒泡排序算法(冒泡排序算法代码)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个元素,并且如果它们的顺序错误就交换它们。重复地进行这个过程直到整个列表都是有序的。以下是用C语言实现冒泡排序算法的示例代码:#inc...

C语言的十大组数之冒泡排序法的应用

情景回顾上节回顾:C语言的数组:跨越一个阶梯,如何用一种数据结构存储无限多的数据?本节重点本节重点:冒泡排序法关注不迷路微信公众号:工控小新学习工控知识就来工控小新,为你提供工控笔记知识:EPLAN电...