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)
相关推荐
J***79391 小时前
后端在分布式系统中的数据分片
算法·哈希算法
sin_hielo3 小时前
leetcode 2872
数据结构·算法·leetcode
dragoooon343 小时前
[优选算法专题八.分治-归并 ——NO.49 翻转对]
算法
AI科技星3 小时前
为什么宇宙无限大?
开发语言·数据结构·经验分享·线性代数·算法
Zero-Talent4 小时前
位运算算法
算法
不穿格子的程序员4 小时前
从零开始刷算法——双指针-三数之和&接雨水
算法·双指针
合方圆~小文5 小时前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
无限进步_5 小时前
C语言数组元素删除算法详解:从基础实现到性能优化
c语言·开发语言·windows·git·算法·github·visual studio
松涛和鸣5 小时前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法