Python冒泡排序及优化、选择排序、插入排序及优化

Python冒泡排序及优化、选择排序、插入排序及优化

1. 冒泡排序

在这里插入图片描述

def bubble_sort(alist):
    '''冒泡排序'''
    for i in range(len(alist)-1, 0, -1):   # i表示每次遍历需要比较的次数,逐渐减小
        for j in range(i):
            if alist[j] > alist[j + 1]:
                alist[j], alist[j + 1] = alist[j + 1], alist[j]
        
alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
bubble_sort(alist)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
  • 冒泡排序优化
    def bubble_sort2(alist):
        '''冒泡排序优化'''
        for i in range(len(alist)-1, 0, -1):
            count = 0        # 记录交换次数
            for j in range(i):
                if alist[j] > alist[j + 1]:
                    alist[j], alist[j + 1] = alist[j + 1], alist[j]
                    count += 1
            if count == 0:   # 若某次遍历中无交换,则不用再比较
                return
            
    alist2 = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
    bubble_sort2(alist2)
    print(alist2)
    
    [2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
    
2. 选择排序

在这里插入图片描述

def selection_sort(alist):
    '''选择排序'''
    n = len(alist)
    for i in range(n-1):               # n-1次选择操作
        min_index = i                  # 最小值位置
        for j in range(i + 1, n):      # 从i+1位置到末尾选择出最小数字
            for j in range(i + 1, n):
                if alist[j] < alist[min_index]:
                    min_index = j
        if min_index != i:             # 若选择出的数字不在正确位置,则进行交换
            alist[i], alist[min_index] = alist[min_index], alist[i]

alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
selection_sort(alist)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
3. 插入排序

在这里插入图片描述

def insert_sort(alist):
    '''插入排序'''
    for i in range(1, len(alist)):   # 从第2个位置,即下标为1的元素开始向前插入
        for j in range(i, 0, -1):    # 从第i个元素开始向前比较,若小于前一个元素,则交换位置(向前插一位)
            if alist[j] < alist[j - 1]:
                alist[j], alist[j - 1] = alist[j - 1], alist[j]

alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
insert_sort(alist)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
  • 插入排序优化
    def insert_sort2(alist):
        '''插入排序优化'''
        for i in range(1, len(alist)):
            for j in range(i, 0, -1):
                if alist[j] < alist[j - 1]:
                    alist[j], alist[j - 1] = alist[j - 1], alist[j]
                else:       # 当前数字大于等于前一个数字,则不再进行比较
                    break
    
    alist2 = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
    insert_sort(alist2)
    print(alist2)
    
    [2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
    
总结:
类别最优时间复杂度最坏时间复杂度平均时间复杂度空间复杂度稳定性
冒泡排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不稳定
插入排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定

图片来源于:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值