L4:排序-1(冒泡、选择、插入)

本文介绍了三种常见的排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素的比较和交换逐步将最大值推到末尾;选择排序则在每一轮中找到无序区的最小值并放到已排序区;插入排序则是将每个元素插入到已排序部分的正确位置。这些算法的时间复杂度均为O(n^2),属于原地排序算法。
摘要由CSDN通过智能技术生成

排序

  • 意思:将一组“无序”的记录序列调整为“有序”的记录序列
  • 列表排序:将无需列表变为有序列表
    • 输入:列表
    • 输出:有序列表
  • 升序与降序
  • 内置排序函数:sort()

常见排序算法

  • 普通:冒泡排序、选择排序、插入排序...
  • 进阶:快速排序、堆排序、归并排序...
  • 其他:希尔排序、计数排序、基数排序...

冒泡排序(Bubble Sort)

  • 列表每两个相邻的数,如果前面比后面大,则交换这两个数
  • 一趟排序完成后,无序区减少一个数,有序区增加一个数
  • 排完需要n-1趟
  • 算法关键点:趟、无序区范围
  • 时间复杂度O(n^2)

代码:

def bubble_sort(li):
    for i in range(len(li)-1): #第i趟
        for j in range(len(li)-i-1): #指针范围
            if li[j] > li[j+1]: #此处升序,降序改为<
                li[j], li[j+1] = li[j+1], li[j]

 改进:如果当前趟排序完后与上一趟的排序结果相同,说明已经排序完毕,不需要跑完全部n-1趟

def bubble_sort(li):
    for i in range(len(li)-1): #第i趟
        exchange = False
        for j in range(len(li)-i-1): #指针范围
            if li[j] > li[j+1]: #此处升序,降序改为<
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            return

 选择排序(Select Sort)

  • 意思:一趟排序记录最小的数,放到第一个位置,再一趟排序,无序区最小的数放到第二个位置......
  • 排完需要n-1趟
  • 算法关键点:有序区和无序区、无序区最小数的位置
  • 时间复杂度O(n^2)

不太好的代码:

def select_sort_simple(li):
    li_new = []
    for i in range(len(li)):
        min_val = min(li)
        li_new.append(min_val)
        li.remove(min_val)
    return li_new
#缺点是新列表占内存,min、remove都是O(n),所以最后的时间复杂度是O(n^2)

正常代码:

def select_sort(li):
    for i in range(len(li)-1): #第i趟
        min_loc = i
        for j in range(i+1, len(li)): #无序区范围
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]

插入排序(Insert Sort)

  • 初始时手里(有序区)只有一张牌
  • 每次(从无序区)摸一张牌,插入到手里已有牌的正确位置
  • 时间复杂度O(n^2)
def insert_sort(li):
    for i in range(1, len(li)): #表示摸到的牌的下标
        temp = li[i] #摸到的牌的值
        j = i-1 #手里的牌的下标
        while j >= 0 and li[j] > temp:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = temp

 冒泡排序、选择排序、插入排序比较

  • 都是原地排序
  • 时间复杂度都是O(n^2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值