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)
相关推荐
LYFlied6 分钟前
【每日算法】LeetCode 105. 从前序与中序遍历序列构造二叉树
数据结构·算法·leetcode·面试·职场和发展
重生之我是Java开发战士7 分钟前
【数据结构】Java对象的比较
java·jvm·数据结构
DanyHope11 分钟前
LeetCode 206. 反转链表:迭代 + 递归双解法全解析
算法·leetcode·链表·递归·迭代
NAGNIP15 分钟前
才发现TensorBoard是个可视化的神器!
算法
历程里程碑20 分钟前
C++ 16:C++11新特化
c语言·开发语言·数据结构·c++·经验分享
_dindong20 分钟前
算法杂谈:回溯路线
数据结构·算法·动态规划·bfs·宽度优先
咋吃都不胖lyh21 分钟前
详解 UCB 算法的置信区间与核心逻辑(通俗 + 公式 + 实例)
人工智能·算法·机器学习
DanyHope29 分钟前
LeetCode 两数之和:从 O (n²) 到 O (n),空间换时间的经典实践
前端·javascript·算法·leetcode·职场和发展
free-elcmacom36 分钟前
机器学习高阶教程<6>推荐系统高阶修炼手册:混排、多任务与在线学习,解锁精准推荐新境界
人工智能·python·学习·算法·机器学习·机器人
断剑zou天涯36 分钟前
【算法笔记】AC自动机
java·笔记·算法