简单排序算法

简单排序算法

Created: March 9, 2022 10:53 AM
Introduction: 介绍什么是排序,以及简单的排序算法,像冒泡,选择,插入排序这些
Source: 原创
Tags: 算法专栏


列表排序

  • 排序:将一组“无序”的记录序列调整为“有序”的记录序列

  • 列表排序:将无序列表变为有序列表

    • 输入:列表
    • 输出:有序列表
  • 升序与降序

    • 升序就是小的在前面,大的在后面
    • 降序就是大的在前面,小的在后面
  • Python内置排序函数:sort()

  • 排序Low B三人组

    • 冒泡排序
    • 选择排序
    • 插入排序
  • 排序NB三人组

    • 快速排序
    • 堆排序
    • 归并排序
  • 其他排序

    • 希尔排序
    • 计数排序
    • 基数排序

冒泡排序(Bubble Sort)

  • 列表每两个相邻的数,如果前面比后面大,则交换这两个数。
  • 一趟排序完成后,则无序区减少一个数,有序区增加一个数。
  • 代码关键点:趟、无序区范围
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
def bubble_sort(li):
    for i in range(len(li)-1):  # 第i趟
        for j in range(len(li)-1-i):    # 无序区域
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]

冒泡排序 - 优化

  • 如果冒泡排序中的一趟排序没有发生交换,则说明列表已经有序,可以直接结束算法。
def bubble_sort(li):
    for i in range(len(li)-1):  # 第i趟
        exchange = False        # 添加是否改变标志位
        for j in range(len(li)-1-i):    # 无序区域
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True # 每趟如果有变动则改变标志位为True
        if not exchange:        # 如果这趟没有变动,则改变标志位为False,即没有变化,列表为有序,直接返回
            return

选择排序(Select Sort)

  • 一趟排序记录最小的数,放到第一个位置
  • 再一趟排序记录列表无序区最小的数,放到第二个位置
  • 算法的关键点:有序区和无序区、无序区最小数的weizh
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()函数的时间复杂度是 O ( n ) O(n) O(n),remove方法的时间复杂度也是 O ( n ) O(n) O(n),外面再套一个循环,所以整个的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

选择排序 - 标准

def select_sort(li):
    for i in range(len(li)-1):  # 第i趟
        min_loc = i             # 记录最小值的位置
        for j in range(i,len(li)):
            if li[min_loc] > li[j]:
                min_loc = j     # 遍历查找后面最小的值并赋值
        if min_loc != i:
            li[i], li[min_loc] = li[min_loc], li[i] # 交换

插入排序

  • 初始时手里(有序区)只有一张牌。
  • 每次(从无序区)摸一张牌,插入到手里已有牌(有序区)的正确位置。
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
def insert_sort(li):
    for i in range(1,len(li)):  # 第i次摸牌,i表示摸到的牌的下标
        tmp = li[i]             # 用临时变量储存摸到的牌
        j = i - 1               # j指的是手里的牌
        while j >= 0 and li[j] > tmp:   # 寻找插入位置:如果j >= 0的情况下(对比有序区),出现有比摸到的牌大的牌就往右移动
            li[j+1] = li[j]     # 将j+1空间里存放j空间的值,其实就是把牌往右移
            j -= 1              # j-1继续对有序区的其他牌继续进行判断直到牌比摸到的牌小为止
        li[j+1] = tmp           # 将牌插入当前位置

相关参考

清华大学博士讲解Python数据结构与算法:https://www.bilibili.com/video/BV1uA411N7c5?p=11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuZou 邹宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值