python 数据结构 排序算法

冒泡排序

python 复制代码
def doubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

arr = [64, 34, 25, 12, 22, 11, 90]
doubble_sort(arr)
print("Sorted array is:", arr)

输出:

python 复制代码
Sorted array is: [11, 12, 22, 25, 34, 64, 90]

归并排序

python 复制代码
def merge_sort(arr):
    n = len(arr)
    if n > 1:
        mid = n // 2
        L = arr[:mid]
        R = arr[mid:]

        merge_sort(L)
        merge_sort(R)

        i = j = k = 0

        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1

        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1

        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1

arr = [38, 27, 43, 3, 9, 82, 10]
merge_sort(arr)
print("Sorted array is:", arr)

输出:

python 复制代码
Sorted array is: [3, 9, 10, 27, 38, 43, 82]

插入排序

python 复制代码
def insertion_sort(input_list):
    # 1. 遍历未排序区间(从第2个元素开始,索引1到末尾)
    for i in range(1, len(input_list)):
        # 2. 取出当前未排序区间的第一个元素作为key(要插入的元素)
        key = input_list[i]
        # 3. j指向已排序区间的最后一个元素(i-1)
        j = i - 1
        
        # 4. 向前遍历已排序区间,找到key的插入位置
        # 条件:j≥0(不越界)且 key < 已排序元素(需要后移)
        while j >= 0 and key < input_list[j]:
            # 把已排序元素后移一位(给key腾位置)
            input_list[j + 1] = input_list[j]
            j -= 1  # 继续向前找
        
        # 5. 把key插入到正确位置(j+1是因为最后一次j多减了1)
        input_list[j + 1] = key

# 测试用例
input_list = [12, 11, 13, 5, 6]
insertion_sort(input_list)
print("Sorted array is:", input_list)

输出:

python 复制代码
Sorted array is: [5, 6, 11, 12, 13]

shell希尔排序

python 复制代码
def shell_sort(arr):
    # 1. 获取列表长度
    n = len(arr)
    # 2. 初始化间隔gap为列表长度的一半(核心:分组依据)
    gap = n // 2
    
    # 3. 循环:直到gap缩小为0(所有分组排序完成)
    while gap > 0:
        # 4. 对每个gap分组执行插入排序(从gap位置开始遍历)
        for i in range(gap, n):
            # 5. 取出当前元素作为待插入的"关键值"
            temp = arr[i]
            # 6. j指向当前元素的位置,用于向前遍历同组元素
            j = i
            
            # 7. 同组内的插入排序逻辑:
            # 条件1:j >= gap(不越界);条件2:前一个同组元素 > temp(需要后移)
            while j >= gap and arr[j - gap] > temp:
                # 前一个同组元素后移(给temp腾位置)
                arr[j] = arr[j - gap]
                # 向前移动gap步,继续比较同组元素
                j -= gap
            
            # 8. 将temp插入到同组的正确位置
            arr[j] = temp
        
        # 9. 缩小间隔(减半),进入下一轮分组排序
        gap //= 2

# 测试用例
arr = [12, 34, 54, 2, 3]
shell_sort(arr)
print("Sorted array is:", arr)

输出:

python 复制代码
Sorted array is: [2, 3, 12, 34, 54]

选择排序

python 复制代码
def selection_sort(arr):
    # 1. 获取列表长度
    n = len(arr)
    
    # 2. 外层循环:确定已排序区间的末尾位置(i是未排序区间的第一个元素索引)
    for i in range(n):
        # 3. 初始化最小值索引为未排序区间的第一个元素(假设当前第一个是最小)
        min_idx = i
        
        # 4. 内层循环:遍历未排序区间,找到最小值的索引
        for j in range(i+1, n):
            # 如果当前元素比最小值小,更新最小值索引
            if arr[j] < arr[min_idx]:
                min_idx = j
        
        # 5. 交换:把最小值放到未排序区间的第一个位置(加入已排序区间)
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

# 测试用例
arr = [64, 25, 12, 22, 11]
selection_sort(arr)
print("Sorted array is:", arr)

输出:

python 复制代码
Sorted array is: [11, 12, 22, 25, 64]

快速排序

python 复制代码
def quick_sort(arr, low=None, high=None):
    # 初始化:第一次调用时设置low和high的默认值(数组首尾索引)
    if low is None:
        low = 0
    if high is None:
        high = len(arr) - 1
    
    # 递归终止条件:子数组长度≤1(无需排序)
    if low >= high:
        return
    
    # 1. 分区操作:返回基准值的最终位置
    pivot_index = partition(arr, low, high)
    
    # 2. 递归排序基准值左侧子数组
    quick_sort(arr, low, pivot_index - 1)
    # 3. 递归排序基准值右侧子数组
    quick_sort(arr, pivot_index + 1, high)

def partition(arr, low, high):
    """
    分区函数:将数组分为「小于基准值」「基准值」「大于基准值」三部分
    :param arr: 待分区数组
    :param low: 子数组起始索引
    :param high: 子数组结束索引
    :return: 基准值的最终索引
    """
    # 选第一个元素作为基准值(pivot)
    pivot = arr[low]
    # 左指针:从low+1开始找大于pivot的元素
    left = low + 1
    # 右指针:从high开始找小于pivot的元素
    right = high
    
    while True:
        # 左指针右移:找到第一个大于pivot的元素
        while left <= right and arr[left] <= pivot:
            left += 1
        # 右指针左移:找到第一个小于pivot的元素
        while left <= right and arr[right] >= pivot:
            right -= 1
        
        # 若左指针超过右指针,分区结束
        if left > right:
            break
        # 交换左右指针指向的元素(把小的放左,大的放右)
        arr[left], arr[right] = arr[right], arr[left]
    
    # 把基准值放到最终位置(右指针的位置)
    arr[low], arr[right] = arr[right], arr[low]
    # 返回基准值索引
    return right

# 测试用例
arr = [64, 25, 12, 22, 11, 3, 99, 5]
quick_sort(arr)
print("Sorted array is:", arr)  

输出:

python 复制代码
Sorted array is: [3, 5, 11, 12, 22, 25, 64, 99]
相关推荐
invincible_Tang2 小时前
AcWing 796. 子矩阵的和 _
数据结构·算法
喵手2 小时前
Python爬虫高阶:用 Playwright “监听” Figma 社区热门插件数据!
爬虫·python·爬虫实战·figma·playwright·零基础python爬虫教学·社区热门插件数据采集
MoRanzhi12032 小时前
Pillow 图像滤波、卷积与边缘处理
图像处理·python·计算机视觉·pillow·卷积·边缘检测·图像滤波
怪侠_岭南一只猿2 小时前
爬虫学习阶段三:动态网页爬取(完整学习文档)
爬虫·python·学习
南 阳2 小时前
Python从入门到精通day48
开发语言·python
虎大猫猫2 小时前
JupyterLab的安装与使用完全指南
ide·python·jupyter
web3.08889992 小时前
如何确保1688商品数据API接口的安全性
python
<-->2 小时前
SGLang 相比 vLLM 的主要优势
人工智能·pytorch·python·transformer