冒泡排序、插入排序与选择排序(Python)

系统 1608 0

1、冒泡排序

  • 冒泡排序只会操作相邻的两个数据。
  • 每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。
  • 一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

第一次冒泡操作的详细过程

冒泡排序、插入排序与选择排序(Python)_第1张图片

经过一次冒泡操作之后,6 这个元素已经存储在正确的位置上。要想完成所有数据的排序,我们只要进行 6 次这样的冒泡操作就行了。

冒泡排序、插入排序与选择排序(Python)_第2张图片

实际上,冒泡过程还可以优化。当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。下图中的另外一个例子,这里面给 6 个元素排序,只需要 4 次冒泡操作就可以了。

冒泡排序、插入排序与选择排序(Python)_第3张图片

优化后的冒泡排序代码如下:

            
              """
    优化的冒泡排序:
    当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作
"""
def bubble_sort(a):
    '''   
    :param a: List[int]
    '''
    length = len(a)
    if length <= 1:
        return 

    for i in range(length):
        made_swap = False
        # 下标j + 1 最大为 length - 1
        for j in range(length-1-i):
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                made_swap = True
        # 优化:无数据交换,结束排序操作
        if not made_swap:
                break
    return a

if __name__ == '__main__':
    a = [7,1,4,3,6,5]
    print(bubble_sort(a))
            
          

 

2、插入排序

首先,我们将数组中的数据分为两个区间, 已排序区间 未排序区间 。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

如图所示,要排序的数据是 4,5,6,1,3,2,其中左侧为已排序区间,右侧是未排序区间。

插入排序也包含两种操作,一种是元素的 比较 ,一种是元素的 移动 。当我们需要将一个数据 a 插入到已排序区间时,需要拿 a 与已排序区间的元素依次比较大小 ,找到合适的插入位置。找到插入点之后,我们还需要 将插入点之后的元素顺序往后移动一位 ,这样才能腾出位置给元素 a 插入。

冒泡排序、插入排序与选择排序(Python)_第4张图片

代码如下:

            
              """
    插入排序包含两种操作,一种是元素的比较,一种是元素的移动。
    当我们需要将一个数据 a 插入到已排序区间时,需要拿 a 与已排序区间的元素依次比较大小,找到合适的插入位置。
    找到插入点之后,我们还需要将插入点之后的元素顺序往后移动一位,这样才能腾出位置给元素 a 插入。
"""
def insertion_sort(a):
    '''
    :param a: List[int]
    '''
    length = len(a)
    if length <= 1:
        return

    for i in range(1, length):
        value = a[i]
        j = i - 1
        # 查找插入位置,在前面的已排序区间,拿value与已排序区间的元素依次比较大小
        while j >= 0 and a[j] > value:
            # 数据向后移动
            a[j+1] = a[j]
            j -= 1
        # 插入数据
        a[j+1] = value

    return a

if __name__ == '__main__':
    a = [7,1,4,3,6,5]
    print(insertion_sort(a))
            
          

 

3、选择排序

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会 从未排序区间中找到最小的元素,将其放到已排序区间的末尾

冒泡排序、插入排序与选择排序(Python)_第5张图片

选择排序是一种不稳定的排序算法。从图中可以看出,选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。  

比如 5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以就不稳定了。

正是因此,相对于冒泡排序和插入排序,选择排序就稍微逊色了。

代码如下:

            
              def selection_sort(a):
    length = len(a)
    if length <= 1:
        return

    for i in range(length):
        # i是每次已排序区间的末尾
        min_index = i
        min_val = a[i]
        # 查找未排序区间中最小的元素
        for j in range(i, length):
            if a[j] < min_val:
                # 未排序区间最小的元素
                min_val = a[j]
                min_index = j
        a[i], a[min_index] = a[min_index], a[i]

    return a

if __name__ == '__main__':
    a = [7,1,4,3,6,5]
    print(selection_sort(a))
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论