python算法与数据结构:08排序算法

本文详细介绍了Python中的几种排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序和桶排序。分析了它们的时间复杂度、稳定性以及适用场景。在稳定性方面,冒泡排序、插入排序和归并排序是稳定的,而选择排序、希尔排序、快速排序和根排序则是不稳定的。在选择排序算法时,如果对稳定性无特殊要求,可以考虑快速排序;如果需要稳定性,推荐使用归并排序;对于小规模数据,插入排序也是一个简洁的选择。
摘要由CSDN通过智能技术生成

在这里插入图片描述

稳定性定义:相同的值在排序结束之后的相对次序不变。

1. 冒泡排序

每一轮相邻两个值之间比较,大小顺序相反的交换位置,最后的值总是最大。

稳定性:稳定

def BubbleSort(alist):
    """冒泡排序 """
    #最坏时间复杂度= O(n^2)
     #用count控制如某一层从头到尾的比较中没有做任何交换,说明顺序已经正确,不用继续比,可使最优复杂度变为 O(n)
    n = len(alist)
    for i in range(n-1) # 外层控制一共走多少次       
        count = 0 
        for j in range(n-1-i):
            # 内层控制从头走到尾
            if alist[j] > alist[j+1]:#因为没有等号,所以相邻值相等时不改变次序,是稳定的算法
                alist[j],alist[j+1] = alist[j+1],alist[j]
            	count += 1
        if count == 0:
            return


if __name__ == "__main__":
    li = [32,54,12,45,23,13,67,12,43]
    print(li)
    BubbleSort(li)
    print(li)

2. 选择排序

思路:认为左边有序右边无序。将右边无序的数值中找到最小的,第二小的依次与左边的交换位置。

稳定性:考虑从小到大排列,第一个元素是10,被最小值调换之后就排到列表中的10后面.所以不稳定

def SelectSort(alist):
    """选择排序""" # 最优和最坏时间复杂度都是O(n^2) 不稳定
    n = len(alist)
    for i in range(n-1):
        min_index = i
        for j in range(i+1,n):
            if alist[j] < alist[min_index]:
                min_index = j
        alist[i],alist[min_index] = alist[min_index],alist[i]

if __name__ == "__main__":
    li = [32,54,12,45,23,13,67,12,43]
    print(li)
    SelectSort(li)
    print(li)

3. 插入排序

假设左边有序,右边无序。

先拿出第一个元素,每一轮将右边剩下的元素与左边比较,依次往前挪直到前面一个比他小

  • 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
  • 最坏时间复杂度:O(n^2) (升序排列,序列处于降序状态)
  • 稳定性:稳定
# def InsertSort(alist):
#     n = len(alist)
#     for i in range(1,n):
#         j = i  # j代表内层循环起始值
#         while j > 0:
#             if alist[j] < alist[j-1]:
#                alist[j],alist[j-1] = alist[j-1],alist[j]
#                j -= 1
#             else:
#                 break
""" 等价2个for循环:"""
def InsertSort(alist):
    n 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值