数据结构-排序

一 交换排序

1、冒泡排序

python 复制代码
# todo 比较相邻元素,往前或往后进行比较,每次找出最大或最小的一个值
def bubblesort(list):
    len_list = len(list)
    # 如果就一个数值,直接返回,不需要再进行排序
    if len_list <= 1:
        return list
    # 如果有多个数值,进行冒泡排序
    # 每进行一遍 i ,就相当于走了一遍排序,选出一个最大或最小的数值,这时候只需要再遍历比较剩下的 len(list) -1 -i 个数就可以了
    # todo  len(list) -1:数组下表 0 开始,最后一个元素下表是 len(list) -1
    # todo -i:每次遍历剩下的数,减去已经遍历过的 i 个数
    for i in range(len_list):
        # len_list - 1 - i : 还剩下多少趟
        for j in range(0,len_list - 1 - i):
            if list[j] < list[j + 1]:
                list[j + 1], list[j] = list[j], list[j + 1]
    return list


if __name__ == '__main__':
    in_ = input('请输入待排序数列(例:1,2,3):\n')
    in_split = in_.split(',')
    # ['1', '2']
    arr = []
    # 对列表中的元素进行数值类型转换
    for i in in_split:
        arr.append(int(i))
    # print(arr)
    bubblesort1 = bubblesort(arr)
    print(bubblesort1)

2、快速排序

python 复制代码
# todo 需要递归调用分区进行排序
def quick_sort(list):
    def partition(list,left,right):
        key = left
        while left < right:
            # todo 升序
            # 右边的数值小于基准,不进行变动,这一步可以找到比基准 小 的值,如果 list[right] 比基准大,那么就前移一位,不满足条件时候
            # right-1 就是比基准小的数的下表
            while left < right and list[right] >= list[key]:
                right -= 1
            # 右边的数大于基准,进行数值交换,这一步可以找到比基准 大 的值,如果 list[left] 比基准小,那么就右移一位,不满足条件时候
            # left+1 就是比基准大的数的下表
            while left < right and list[left] <= list[key]:
                left += 1
            # todo 经过两次比较之后,找到了一个比基准大的,一个比基准小的,这时候交换二者的值即可
            list[left],list[right] = list[right],list[left]
        #  todo 当左右两边逐渐逼近的时候,当 right=left 即满足遍历比较了一次,这时候要把基准值 key=left=right
        # 交换 key与left的值,完成第一次的快排
        list[left],list[key] = list[key],list[left]
    #  todo 这个时候已经进行完毕了第一次的快排,左边都是比key小的,右边都是比key大的
        return left



    def rescusive(list,left,right):
        if left >= right:
            return
        #  第一次分区,从基准开始
        mid = partition(list,left,right)
        # 递归调用
        rescusive(list, left, mid - 1)
        rescusive(list, mid + 1, right)

    # 主函数
    len_list = len(list)
    if len_list <= 1:
        return list
    rescusive(list,0,len_list-1)
    return list

if __name__ == '__main__':
    in_ = input('请输入待排序数列(例:1,2,3):\n')
    in_split = in_.split(',')
    # ['1', '2']
    arr = []
    # 对列表中的元素进行数值类型转换
    for i in in_split:
        arr.append(int(i))
    quicksort = quick_sort(arr)
    print(quicksort)

二 插入排序

1、插入排序

python 复制代码
# todo 每次从后取一个数插入到前面已经排好序的序列中,需要与之前已排好序的进行比较
def insert_sort(list):
    len_list = len(list)
    if len_list <= 1:
        return
    # todo 用 i 来记录遍历了几次
    for i in range(1,len_list):
        print('第{}次循环'.format(i))
        # i 不变,用来记录循环次数,将这个值赋给 j,用j来代替 i 进行往前遍历
        j = i
        # 拿到需要进行排序的 数值
        wait_sort = list[i]
        while j > 0 and wait_sort < list[j-1]:
            list[j] = list[j-1]
            j -= 1
        list[j] = wait_sort
    return list


if __name__ == '__main__':
    in_ = input('请输入待排序数值(例:1,2,3):\n')
    in_split = in_.split(',')
    arr = []
    for i in in_split:
        arr.append(int(i))
    in_sort = insert_sort(arr)
    print(in_sort)

三 数值排序

1、计数排序

python 复制代码
# todo 创建全0列表,将列表中的值作为下表,计数出现的次数,之后再遍历 计数列表,看指定index值是多少,就往列表中添加多少次
def count_number_sort(lst):
    n = len(lst)
    num = max(lst)
    # 生成全 0 列表,后续用来记录每个数出现了几次,用于计数,比如输入的是 [2,1,2],那么生成的就是 [0,0,0]
    # 将值作为下表,那么就是 [0,1,2]:代表 0没有 1有一个 2有两个
    # 全0列表长度 = 列表中的最大值
    # 输入列表:[2,1,2]
    # 生成的全0列表:[0,0,0]
    count = [0] * (num + 1)
    # 根据 下标(列表中的数值) 进行计数
    for i in range(0, n):
        count[lst[i]] += 1
    # count[lst[0]=2] = [0,0,1]
    # count[lst[1]=1] = [0,1,1]
    # count[lst[2]=2] = [0,1,2]
    arr = []
    # i 取值是全 0 列表的长度,+1 是因为 右开,需要保证能取到 列表长度,所以要 +1
    for i in range(0, num + 1):
        # count[i]是多少,就往 arr 列表中加几次 i,这样保证从 count 列表中是有序取出加到 arr 中的
        for j in range(0, count[i]):
            arr.append(i)
    return lst

if __name__ == '__main__':
    in_ = input('请输入(列:1,2,3):\n')
    in_split = in_.split(',')
    arr = []
    for i in in_split:
        arr.append(int(i))
    print(count_number_sort(arr))

四 选择排序

1、选择排序

python 复制代码
# todo 每次从剩下的待排序的序列中选出一个插入到前边已排好序的序列中的'末尾',不再需要跟前边已排好序的进行比较,遍历一次末尾插入一个
def ChooseSort(list):
    len_list = len(list)
    if len_list <= 1:
        return
    for i in range(len_list):
        min_val = list[i]
        min_index = i
        for j in range(i+1,len_list):
            if list[j] < min_val:
                # 如果有小于的,那么更新当前的最小值和最小下表
                min_val = list[j]
                min_index = j
                # 对最小值和第i位的值进行互换
                list[i],list[min_index] = list[min_index],list[i]
    return list

if __name__ == '__main__':
    in_ = input('请输入(例:1,2,3)\n')
    in_split = in_.split(',')
    arr = []
    for i in in_split:
        arr.append(int(i))
    res = ChooseSort(arr)
    print(res)
相关推荐
lifallen5 分钟前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
wt_cs19 分钟前
银行回单ocr api集成解析-图像文字识别-文字识别技术
开发语言·python
_WndProc41 分钟前
【Python】Flask网页
开发语言·python·flask
互联网搬砖老肖43 分钟前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
测试者家园1 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
大模型真好玩1 小时前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
前端付豪1 小时前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python
前端付豪1 小时前
12、用类写出更可控、更易扩展的爬虫框架🕷
后端·python
江太翁1 小时前
Pytorch torch
人工智能·pytorch·python
2401_881244402 小时前
Treap树
数据结构·算法