python简洁实现:插入、冒泡、快排、选择排序算法

本文深入探讨了插入排序、冒泡排序、快速排序和选择排序四种基本排序算法的实现原理及代码示例。通过详细的步骤解释,帮助读者理解每种算法的工作机制,并提供了Python代码实现,便于实践与学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、插入排序

二、冒泡排序

三、快速排序(递归)

四、选择排序



生成一个长度为10的范围在0~20的随机不重复数组

import random

temp_list = []
while True:
        num = random.randint(0, 20)
        if num not in temp_list:
                temp_list.append(num)
        if len(temp_list) == 10:
                break

print temp_list 

一、插入排序

def insert(list):
    """
    插入 :倒序比较,由于每次只能向前一步,所以每次插入都要重新赋值(i = j)
    """
    length = len(list)
    for i in range(1, length): # 忽略第一个,遍历后面的
        j = i - 1 # 交换的位置起始值(即和最大值先比较)
        while j >= 0 and list[j] > list[i]: # 拿需要插入的数据和之前排序好的列表比较,如果大于排序好的最后一位,i 直接加 1 就行;如果小于的话,相邻位置一直两两交换,直到大于 j 位置上的数字(直到为0索引位置)
            list[i], list[j] = list[j], list[i]
            print('j:', j, list)
            i = j # i 始终是 这个需要插入的数据的下标值
            j -= 1
    print("finished:", list)

二、冒泡排序

def bubble_sort(list):
    length = len(list) - 1 # 假设列表有3个数,因为每次会找出列表中的最大值,所以找出2个最大值就不用排序了
    for i in range(length): # [0, length-2],表示遍历 第 i 次的次数
        flag = True # 标记优化,若是此次循环没有任何交换,就可以认为全部顺序已定
        for j in range(length - i): #[0, length-2-i],所以遍历了i次后,后面i个数 便不用比较了
            if list[j] > list[j+1]: # 如果这个数比后面的数大,便往后移动;因为少取一次,所以j+1不会超出范围
                list[j], list[j+1] = list[j+1], list[j]
                flag = False
                print("j", j, list)
        print("i", i, list)
        if flag:
            break
    print('bubble_sort', list)

三、快速排序(递归)

def kuaipai(list):
    """kuaipai"""
    if list == []:
        return []
    else:
        temp = list[0]
        left = [i for i in list if i < temp] # 不考虑重复数字,不加等号
        right = [i for i in list if i > temp]
        return kuaipai(left) + [temp] + kuaipai(right)

四、选择排序

def choose(list):
    length = len(list)
    for i in range(length): # [0, length - 1],遍历的次数
        x = i # 以此为比较的基数,每次选出最小值
        for j in range(i, length): # [i, length - 1]
            if list[x] > list[j]:
                x = j  # 如果找到较小值,便赋给 x,以便和后面的数再次比较
        list[i], list[x] = list[x], list[i] # 最后,把找到的最小值交换到遍历的 i 索引下
    print(list)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值