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)
相关推荐
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
爱吃苹果的日记本3 小时前
数据结构第三课(时间复杂度)
数据结构·学习
罗西的思考3 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
Logic1014 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
小哈里5 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小π军5 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司5 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
a187927218316 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记6 小时前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展
Logic1016 小时前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题