蓝桥杯Python赛道备赛——Day3:排序算法(二)(归并排序、堆排序、桶排序)

news2025/3/16 10:34:38

   本博客是蓝桥杯备赛系列中排序算法的第二期,包括:归并排序、堆排序和桶排序。每一个算法都在给出概念解释的同时,给出了示例代码,以供低年级师弟师妹们学习和练习。

   由于本期的三个算法的复杂度相对来说要高于上一期的三个算法,因此,每个算法均以某个待排序的数组为例,进行逐步分析。

   前序知识:
(1)Python基础语法
(2)Python基础算法
(3)基本数据结构:二叉树初步(知道他是啥就好,详细的数据结构内容计划在Day4讲解)。

   Tips:若对基本数据结构不太了解,可以先往下看,当看到不太懂的内容(如:“堆”)时,再去搜索。


排序算法(二)

      • 一、归并排序
      • 二、堆排序
      • 三、桶排序

一、归并排序

1. 流程示意图:
在这里插入图片描述

2. 举例说明:
   就像上图中所描述的那样,先进行拆分,再逐步合并。
(1)步骤1:递归拆分

原始数组:[38,27,43,3,9,82,10]
第1层拆分:左=[38,27,43]=[3,9,82,10]
第2层拆分:左左=[38] 左右=[27,43] | 右左=[3,9] 右右=[82,10]
继续拆分直到所有子数组长度为1

(2)步骤2:有序合并

左子数组:[27,38,43]  右子数组:[3,9,10,82]
比较过程:3<27 → 填3;9<27 → 填9;10<27 → 填10;27<82 → 填27...
最终结果:[3,9,10,27,38,43,82]

3. 性能分析
(1)优点:

  • 稳定排序(相同值保持原顺序)
  • 时间复杂度稳定O(n log n)
  • 适合链表等非连续存储结构

(2)缺点:

  • 需要额外O(n)存储空间
  • 递归调用栈可能造成内存开销
  • 小规模数据效率低于插入排序

4. 示例代码:

# 归并排序
import numpy as np

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:]) # 递归处理右半部分
    
    # 合并两个有序数组
    return merge(left, right)

def merge(left, right):
    merged = np.empty(len(left)+len(right), dtype=left.dtype) # 创建空数组存放结果
    l = r = i = 0  # 初始化三个指针
    
    # 比较左右数组元素并填充
    while l < len(left) and r < len(right):
        if left[l] <= right[r]:
            merged[i] = left[l]
            l += 1
        else:
            merged[i] = right[r]
            r += 1
        i += 1
    
    # 处理剩余元素
    merged[i:] = left[l:] if l < len(left) else right[r:]
    return merged

# 示例运行
arr = np.array([38, 27, 43, 3, 9, 82, 10])
print("原数组:", arr)
sorted_arr = merge_sort(arr)
print("归并排序结果:", sorted_arr)

二、堆排序

1. 流程示意图:
在这里插入图片描述

2. 举例说明:
(1)步骤1:构建“大根堆”(确保“子节点”永远小于其“双亲节点”)

初始数组:[12,11,13,5,6,7]
构建堆过程:
  调整节点1(11)→ 无交换
  调整节点0(12)→ 与13交换 → [13,11,12,5,6,7]

(2)步骤2:排序阶段,本质是“大根堆”的性质维护

第1次交换后:[7,11,12,5,6,13]
重新堆化后:[12,11,7,5,6,13]
第2次交换后:[6,11,7,5,12,13]
...

3. 性能分析
(1)优点:

  • 原地排序(空间复杂度O(1))
  • 最坏情况仍保持O(n log n)
  • 适合实时数据处理

(2)缺点:

  • 不稳定排序
  • 缓存不友好(跳跃访问)
  • 实现复杂度较高

4. 示例代码:

# 堆排序
import numpy as np

def heapify(arr, n, i):
    largest = i  # 初始化最大元素为根节点
    left = 2 * i + 1
    right = 2 * i + 2
    
    # 检查左子节点是否大于根
    if left < n and arr[left] > arr[largest]:
        largest = left
    
    # 检查右子节点是否大于当前最大值
    if right < n and arr[right] > arr[largest]:
        largest = right
    
    # 如果最大值不在根节点,进行交换并递归调整
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    
    # 构建最大堆(从最后一个非叶子节点开始)
    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)
    
    # 逐个提取元素
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 交换堆顶和末尾元素
        heapify(arr, i, 0)  # 调整剩余元素的堆结构
    
    return arr

# 示例运行
arr = np.array([12, 11, 13, 5, 6, 7])
print("\n原数组:", arr)
heap_sort(arr)
print("堆排序结果:", arr)

三、桶排序

1. 基本步骤:
(1)步骤1:分桶策略
   示例:数据范围0-49,桶大小10 → 5个桶(0-9,10-19,…40-49)
(2)步骤2:桶内排序
   使用任意排序算法,对桶内的数据进行排序。因此,桶内排序算法的选择将影响整体性能。

2. 性能分析
(1)优点:

  • 线性时间复杂度O(n+k)(k为桶数量)
  • 稳定排序(若桶内排序稳定)
  • 适合外部排序场景

(2)缺点:

  • 依赖数据均匀分布
  • 需要额外内存存储桶
  • 空桶会造成空间浪费

3. 示例代码:

# 桶排序
import numpy as np

def bucket_sort(arr, bucket_size=5):
    # 确定数据范围
    min_val, max_val = np.min(arr), np.max(arr)
    
    # 计算需要的桶数量
    bucket_count = (max_val - min_val) // bucket_size + 1
    buckets = [[] for _ in range(bucket_count)]  # 初始化空桶
    
    # 元素分配到桶中
    for num in arr:
        idx = (num - min_val) // bucket_size
        buckets[idx].append(num)
    
    # 对每个桶内部排序(这里使用内置排序)
    sorted_arr = np.empty_like(arr)
    i = 0
    for bucket in buckets:
        if len(bucket) > 0:
            sorted_bucket = np.sort(bucket)  # 实际比赛可用其他排序算法
            sorted_arr[i:i+len(sorted_bucket)] = sorted_bucket
            i += len(sorted_bucket)
    
    return sorted_arr

# 示例运行
arr = np.array([29, 25, 3, 49, 9, 37, 21, 43])
print("\n原数组:", arr)
sorted_arr = bucket_sort(arr)
print("桶排序结果:", sorted_arr)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Type-C:智能家居的电力革命与空间美学重构

在万物互联的时代浪潮中&#xff0c;家居空间正经历着从功能容器到智慧终端的蜕变。当意大利设计师安东尼奥奇特里奥提出"消失的设计"理念二十年后&#xff0c;Type-C充电技术正以润物无声的方式重塑着现代家居的形态与内核&#xff0c;开启了一场静默的居住革命。 【…

第十五届蓝桥杯C/C++组:宝石组合题目(从小学奥数到编程题详解)

这道题目真的一看就不好做&#xff0c;如果直接暴力去做百分之90必挂掉&#xff0c;那么这道题目到底应该怎么去做呢&#xff1f;这我们就得从小学奥数开始聊了。&#xff08;闲话&#xff1a;自从开始蓝桥杯备赛后&#xff0c;每天都在被小学奥数震惊&#xff0c;为什么我小的…

ECharts中Map(地图)样式配置、渐变色生成

前言 ECharts是我们常用的图表控件&#xff0c;功能特别强大&#xff0c;每次使用都要查API比较繁琐&#xff0c;这里就记录开发中常用的配置。 官网&#xff1a;https://echarts.apache.org/handbook/zh/get-started 配置项&#xff1a;https://echarts.apache.org/zh/opti…

MySQL | MySQL表的增删改查(CRUD)

目录 前言&#xff1a;什么是 CRUD ?一、Creat 新增1.1 语法1.2 示例1.2.1 单行数据全列插入1.2.2 单行数据指定列插入1.2.3 多行数据指定列插入 二、Retrieve 检索2.1 语法2.2 示例2.2.1 全列查询2.2.2 指定列查询2.2.3 查询字段为表达式2.2.4 结果去重查询2.2.5 where条件查…

电子电气架构 --- 分布到集中的动カ系统及基于域控制器的架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

基于SpringBoot的“考研互助平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“考研互助平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

基于javaweb的SpringBoot足球俱乐部管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)

视频讲解&#xff1a; DQN 玩 2048 实战&#xff5c;第一期&#xff01;搭建游戏环境&#xff08;附 PyGame 可视化源码&#xff09; 代码仓库&#xff1a;GitHub - LitchiCheng/DRL-learning: 深度强化学习 2048游戏介绍&#xff0c;引用维基百科 《2048》在44的网格上进行。…

高频面试题(含笔试高频算法整理)基本总结回顾24

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

第八节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…

Webpack vs Rollup vs Parcel:构建工具深度对比

文章目录 1. 核心特性对比1.1 功能定位1.2 技术架构对比 2. 配置与使用2.1 Webpack 配置示例2.2 Rollup 配置示例2.3 Parcel 使用示例 3. 性能对比3.1 构建速度3.2 输出质量 4. 生态系统4.1 插件生态4.2 学习曲线 5. 适用场景分析5.1 Webpack 适用场景5.2 Rollup 适用场景5.3 P…

Centos7使用docker搭建redis集群

前置准备&#xff1a; Centos7安装docker就不多说了… 本次目的是搭建3主3从&#xff08;当然你也可以按需扩展&#xff09;准备三台服务器&#xff0c;假定IP分别为&#xff1a;192.168.75.128、192.168.75.129、192.168.75.130安装 redis&#xff1a; #拉取redis docker p…

数字孪生像魔镜,映照出无限可能的未来

在当今科技飞速发展的时代&#xff0c;数字孪生作为一项极具潜力的前沿技术&#xff0c;正逐渐崭露头角&#xff0c;成为众多领域关注的焦点。它犹如一面神奇的魔镜&#xff0c;以数字化的方式精准映照出现实世界中的各种实体与系统&#xff0c;为我们开启了一扇通往无限可能未…

前端知识点---原型-原型链(javascript)

文章目录 原型原型链:实际应用面试题回答 原型 原型:每个函数都有prototype属性 称之为原型 因为这个属性的值是个对象&#xff0c;也称为原型对象 只有函数才有prototype属性 作用: 1.存放一些属性和方法 2.在Javascript中实现继承 const arr new Array(1, 2, 3, 4) con…

数据类设计_图片类设计之6_混合图形类设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论混合图形类设计 方法论-现在能做什么 这段属于聊天内容---有句话是这么说的&#xff1a;不要只埋头拉车&#xff0c;还要抬头看路。写代码也是…

2024年12月CCF-GESP编程能力等级认证C++编程一级真题解析

一级真题的难度: ‌ CCF-GESP编程能力等级认证C++编程一级真题的难度适中‌。这些真题主要考察的是C++编程的基础知识、基本语法以及简单的算法逻辑。从搜索结果中可以看到,真题内容包括了选择题、编程题等题型,涉及的内容如C++表达式的计算、基本输入输出语句的理解…

尤瓦尔·诺亚·赫拉利(Yuval Noah Harari)作品和思想深度报告

尤瓦尔诺亚赫拉利&#xff08;Yuval Noah Harari&#xff09;作品和思想深度报告 引言 尤瓦尔诺亚赫拉利&#xff08;Yuval Noah Harari&#xff09;是当今最具影响力的公众知识分子之一 ynharari.com 。作为一名历史学家和哲学家&#xff0c;他以宏大的视角和清晰生动的语言…

JConsole:JDK性能监控利器之JConsole的使用说明与案例实践

&#x1fa81;&#x1f341; 希望本文能给您带来帮助&#xff0c;如果有任何问题&#xff0c;欢迎批评指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目录 一、背景二、JConsole的启动与连接2.1 JConsole的启动2.2 进程连接2.2.1 本地进程连接2.2…

Neural Architecture Search for Transformers:A Survey

摘要 基于 Transformer 的深度神经网络架构因其在自然语言处理 (NLP) 和计算机视觉 (CV) 领域的各种应用中的有效性而引起了极大的兴趣。这些模型是多种语言任务&#xff08;例如情绪分析和文本摘要&#xff09;的实际选择&#xff0c;取代了长短期记忆 (LSTM) 模型。视觉 Tr…

Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。

一、软件介绍 文末提供源码和开源扩展程序下载 Browser Copilot 是一个开源浏览器扩展&#xff0c;允许您使用现有或定制的 AI 助手来帮助您完成日常 Web 应用程序任务。 目标是提供多功能的 UI 和简单的框架&#xff0c;以实现和使用越来越多的 copilots&#xff08;AI 助手&…