Python排序算法

两数交换原理

在了解算法之前先了解两数交换的原理

复制代码
a,b = b,a   原理: 异或算法
当前元素值: arr[i]
前一个元素:  arr[i-1]    后一个元素:  arr[i+1]

准备要实验的列表

python 复制代码
#0.准备列表 --随机列表,范围,长度自定义
import random
def random_list(start, end,length):
    arr = []
    for i in range(length):
        arr.append(random.randint(start, end))
    return arr

res = random_list(1,10,5)
print(res)

冒泡排序

原理解析

复制代码
 冒泡排序
        元素两两进行比较,每一次排序后较大的值往后移(交换为止)
        技巧:排序n-1    每次比较n - 1 - i次

代码展示

python 复制代码
def bubble_sort(arr):
    #控制排序次数
    for i in range(len(arr)-1):
        #控制比较的次数
        for j in range(len(arr)-i-1):
            #判断元素大小,将较大的值往后移
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
        print(f"第{i + 1}次排序的结果为:{arr}")
    return arr

res = bubble_sort(res)
print(res)

选择排序

原理解析

复制代码
选择排序
        1.按索引顺序从0 ~ length-1每次假设一个最小值,获取最小值索引
        2.按最小值索引后的元素比较大小,如果后续元素笑了,则记录最小值索引,最后并交换位置
        技巧: 总排序次数 length-1

代码展示

python 复制代码
def selection_sort(arr):
    #控制排序次数
    for i in range(len(arr) - 1):
        #定义最小值的key
        key = i     #等价于每次假设的索引从0 - length-1
        for j in range(i + 1, len(arr)):
            #判断后续元素中比假设的key索引对应元素小的话,则记录索引(最小值索引)
            if arr[j] < arr[key]:
                #记录最小值索引
                key = j
        arr[i], arr[key] = arr[key], arr[i]
        print(f"第{i + 1}次排序的结果为: {arr}")
    return arr
res = selection_sort(res)
print(res)

插入排序

原理解析

复制代码
插入排序
        1.从索引为1开始分配已排序和未排序两组
        2.将未排序的元素依次和已排序的比较,如果小了则交换位置,直到大了位置,等于插入

代码展示

python 复制代码
def insertion_sort(arr):
    #从第二个元素(索引为1) 开始遍历
    for i in range(1, len(arr)):
        #记录当前元素
        j = i
        #控制未排序和已排序的元素进行比较,未排序的为外层索引,已排序的为内层索引
        while arr[j-1] > arr[j] and j > 0:
            #交换位置
            arr[j], arr[j-1] = arr[j-1], arr[j]
            #比较上一个元素
            j -= 1
        print(f"第{i + 1}次排序的结果为: {arr}")
    return arr
res = insertion_sort(res)
print(res)

快速排序

原理解析

复制代码
分治法,选一个 "基准值",将列表分为 "小于基准" 和 "大于基准" 两部分,递归排序子列表

代码展示

python 复制代码
def quick_sort(arr):
    # 递归终止条件:列表长度≤1时无需排序
    if len(arr) <= 1:
        return arr
    # 选择第一个元素作为基准
    pivot = arr[0]
    # 小于基准的元素
    left = [x for x in arr[1:] if x <= pivot]
    # 大于基准的元素
    right = [x for x in arr[1:] if x > pivot]
    # 递归排序左右部分,再合并
    return quick_sort(left) + [pivot] + quick_sort(right)

# 测试
sorted_list = quick_sort(res)
print("快速排序结果:", sorted_list)  # 输出:[11, 12, 22, 25, 34, 64, 90]
相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
默_笙4 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003964 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技4 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时4 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控