Python数据结构

排序算法难度排行

排序算法 难度
冒泡排序 ★☆☆☆☆
选择排序 ★☆☆☆☆
插入排序 ★★☆☆☆
希尔排序 ★★★☆☆
归并排序 ★★★☆☆
快速排序 ★★★★☆
堆排序 ★★★★☆
随机基准 / 三路快排 ★★★★☆
基数排序 ★★★★★
桶排序 ★★★★★

一、插入排序(直接插入排序)

双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动

原始序列

第一轮排序过程

内层循环元素6移动1次

第二轮排序,7<9,不用改变

内层循环元素9移动0次

第三轮排序

内层循环元素3移动3次

第四轮

内层循环元素1移动4次

第五轮

内层循环元素5移动3次

第六轮

元素2移动4次

第七轮

元素4移动3次

代码

python 复制代码
def insert_sort(arr):
    for i in range(1,len(arr)):# i 取值范围1-7
        for j in range(i,0,-1):# j 取值范围7-1
            if arr[j]<arr[j-1]:
                temp = 0
                temp = arr[j]
                arr[j] = arr[j-1]
                arr[j-1] = temp
            else:
                break #如果当前元素比前一个元素大,则跳出内层循环,否则有多余的比较
    return arr
if __name__ == "__main__":
    arr = [7,6,9,3,1,5,2,4]
    print(insert_sort(arr))

二、希尔排序


核心是分组

第一轮:数组长度/2 = 4,4个间隔元素进行大小比较和交换

第二轮:4 /2 = 2,2个间隔元素进行大小比较

第三轮:2/2=1,间隔1个元素进行大小比较

代码

python 复制代码
def shell_sort(arr):
    #希尔排序
    group = len(arr) // 2 #分组
    while group > 0:
        #对每个分组进行插入排序
        for i in range(group, len(arr)):
            temp = arr[i]
            j = i
            while j >= group and arr[j - group] > temp:
                arr[j] = arr[j - group]
                j -= group
            arr[j] = temp
        group //= 2
    return arr

if __name__ == "__main__":
    arr = [7,6,9,3,1,5,2,4]
    print(shell_sort(arr))

三、归并排序


归并排序的核心是 "先分后合" :先将数组逐层二分拆分为最小单元(单个元素),再从最小单元开始有序合并相邻子数组,最终得到完整的有序数组

代码

python 复制代码
def merge_sort(arr):
    # 递归终止:数组只有1个元素或空,本身就是有序的
    if len(arr) <= 1:
        return arr
    # 第一步:拆分------把数组分成左右两半
    mid = len(arr) // 2  # 找中间位置
    left = merge_sort(arr[:mid])  # 递归处理左半部分,让左半部分有序
    right = merge_sort(arr[mid:])  # 递归处理右半部分,让右半部分有序
    # 第二步:合并------把两个有序的左右数组合并成一个有序数组
    merged = []  # 存合并后的结果
    i = j = 0  # 两个指针,分别遍历左、右数组
    # 逐个比较左右数组的元素,把小的先放进结果里
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            merged.append(left[i])
            i += 1  # 左指针右移,看下一个元素
        else:
            merged.append(right[j])
            j += 1  # 右指针右移,看下一个元素
    # 把剩下没比较完的元素直接加进去(剩下的肯定是大的,且有序)
    while i < len(left):
        merged.append(left[i])
        i += 1
    while j < len(right):
        merged.append(right[j])
        j += 1
    return merged  # 返回合并好的有序数组
if __name__ == "__main__":
    arr = [7, 6, 9, 3, 1, 5, 2, 4]
    sorted_arr = merge_sort(arr)
    print("原始数组:", arr)
    print("排序后数组:", sorted_arr)

四、普通快速排序


采用双指针,找基准元素

代码

python 复制代码
def quick_sort(arr, low, high):#high和low每次都是变,所以每次递归的参数都是不一样的
    if low < high:
        pivot = arr[high]  # 选最后一个元素作基准
        i = low - 1  # 小于等于基准的区域末尾指针
        for j in range(low, high):
            if arr[j] <= pivot:
                i += 1
                arr[i], arr[j] = arr[j], arr[i]
        # 放置基准到最终位置
        arr[i + 1], arr[high] = arr[high], arr[i + 1]
        pivot_idx = i + 1
        # 递归处理左右子数组
        quick_sort(arr, low, pivot_idx - 1)
        quick_sort(arr, pivot_idx + 1, high)
if __name__ == "__main__":
    arr = [7, 6, 9, 3, 1, 5, 2, 4]
    print("原始数组:", arr)
    quick_sort(arr, 0, len(arr) - 1)
    print("普通快速排序结果:", arr)
相关推荐
灵感__idea5 小时前
Hello 算法:贪心的世界
前端·javascript·算法
澈2076 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
ambition202426 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_6 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi6 小时前
前缀和差分
算法·图论
代码旅人ing7 小时前
链表算法刷题指南
数据结构·算法·链表
Yungoal7 小时前
常见 时间复杂度计算
c++·算法
不爱吃炸鸡柳8 小时前
单链表专题(完整代码版)
数据结构·算法·链表
CylMK8 小时前
题解:AT_abc382_d [ABC382D] Keep Distance
算法
Dfreedom.8 小时前
计算机视觉全景图
人工智能·算法·计算机视觉·图像算法