数据结构——排序(升级篇:快速排序、堆排序、希尔排序、计数排序)

1. 快速排序(Quick Sort)

原理

  • 选择一个基准值(pivot)
  • 将数组分成两部分:小于 pivot 的放左边,大于 pivot 的放右边。然后递归处理

工作过程示例

示例数组:[5, 3, 8, 4, 2]

  • 选择 pivot = 8
    左:[5, 3, 4, 2],中:[8],右:[]
  • 递归左部分 pivot = 4
    左:[3, 2],中:[4],右:[5]
  • 递归 [3, 2] pivot = 2
    左:[],中:[2],右:[3]
  • 合并结果[] + [2] + [3][2, 3]
  • 逐步合并
    [2, 3] + [4] + [5][2, 3, 4, 5]
    [2, 3, 4, 5] + [8][2, 3, 4, 5, 8]

代码

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]  # 选中间值left = [x for x in arr if x < pivot] # 左边mid = [x for x in arr if x == pivot] # 中间right = [x for x in arr if x > pivot] # 右边return quick_sort(left) + mid + quick_sort(right)print(quick_sort([5, 3, 8, 4, 2]))

2. 堆排序(Heap Sort)

原理

  • 构建最大堆(堆顶是最大元素)
  • 将堆顶与末尾交换,缩小堆的范围
  • 重新堆化,直到数组有序

工作过程示例
示例数组:[5, 3, 8, 4, 2]

  • 建最大堆[8, 4, 5, 3, 2](堆顶是最大值 8)
  • 交换堆顶与末尾[2, 4, 5, 3, 8],缩小堆范围
  • 堆化[5, 4, 2, 3, 8]
  • 交换堆顶与末尾[3, 4, 2, 5, 8]
  • 堆化[4, 3, 2, 5, 8]
  • 交换堆顶与末尾[2, 3, 4, 5, 8]
  • 完成排序:[2, 3, 4, 5, 8]

代码

def heapify(arr, n, i):largest = il, r = 2*i + 1, 2*i + 2if l < n and arr[l] > arr[largest]:largest = lif r < n and arr[r] > arr[largest]:largest = rif 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 arrprint(heap_sort([5, 3, 8, 4, 2]))

3. 归并排序(Merge Sort)

原理

  • 递归将数组拆分成左右两半
  • 分别排序后,合并两个有序数组
  • 典型的分治算法,稳定

工作过程示例
示例数组:[5, 3, 8, 4, 2]

  • 拆分:
    [5, 3, 8][4, 2]
    [5, 3][8][5] [3] [8]
    [4] [2]
  • 合并(按顺序):
    [5] + [3][3, 5]
    [4] + [2][2, 4]
  • 合并 [3, 5][8][3, 5, 8]
  • 合并 [3, 5, 8][2, 4][2, 3, 4, 5, 8]

代码

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):res = []i = j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:res.append(left[i])i += 1else:res.append(right[j])j += 1res.extend(left[i:])res.extend(right[j:])return resprint(merge_sort([5, 3, 8, 4, 2]))

4. 希尔排序(Shell Sort)

原理

  • 插入排序的改进版
  • 先分成间隔为 gap 的多个子序列,对每个子序列做插入排序
  • 逐步缩小 gap,直到 gap=1 时完成排序

工作过程示例

示例数组:[5, 3, 8, 4, 2]

  • gap = 2(分组做插入排序)
    组1: [5, 8, 2][2, 8, 5]
    组2: [3, 4][3, 4]
    排序结果:[2, 3, 8, 4, 5]
  • gap = 1(普通插入排序)
    [2, 3, 4, 5, 8] → 完成

代码

def shell_sort(arr):n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2return arrprint(shell_sort([5, 3, 8, 4, 2]))

5. 计数排序(Counting Sort)

原理

  • 适用于整数且范围不大的情况
  • 统计每个值出现的次数
  • 按次数依次回填到数组中

工作过程示例

示例数组:[5, 3, 8, 4, 2]

  • 找范围:min=2,max=8
  • 计数数组(索引表示值-2):
    值:2 3 4 5 6 7 8
    次数:[1,1,1,1,0,0,1]
  • 回填
    输出 [2, 3, 4, 5, 8]

代码

def counting_sort(arr):if not arr:return arrmin_val, max_val = min(arr), max(arr)count = [0] * (max_val - min_val + 1)for num in arr:count[num - min_val] += 1res = []for i, c in enumerate(count):res.extend([i + min_val] * c)return resprint(counting_sort([5, 3, 8, 4, 2]))

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

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

相关文章

C++:浅尝gdb

hp window11 wsl ubuntu what is gdb&#xff1f; GNU调试器&#xff08;英语&#xff1a;GNU Debugger&#xff0c;缩写&#xff1a;GDB&#xff09;&#xff0c;是GNU软件系统中的标准调试器&#xff0c;此外GDB也是个具有移携性的调试器&#xff0c;经过移携需求的调修与…

Android输入法一些常用的命令

Android开发过程可能会遇到Android输入法异常的问题&#xff0c;可以通过如下命令来查看和修改系统的输入法。方便调试。 获取当下系统的所有输入法 adb shell ime list获取当前的可用输入法 adb shell ime list -s获取当前的输入法 adb shell settings get secure default_inp…

Sklearn 机器学习 手写数字识别 加载并查看数据

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Sklearn 机器学习 手写数字识别:加载并查看数据 在机器学习入门案例中,手写数字识别…

卫星通信链路预算之七:上行载噪比计算

在前面的文章中我们介绍了卫星通信链路计算的基础知识&#xff0c;包括&#xff1a; 信噪比分配&#xff1b; 带宽和功带平衡原则&#xff1b; EIRP和G/T&#xff1b; 输入回退&#xff1b; 输入饱和通量密度SFD&#xff1b; 输出回退&#xff1b; 这次我们正式进入正题…

一文读懂PDB格式

最近在做分子对接和分子模拟&#xff0c;涉及到了一些盲区&#xff0c;必去pdb文件是按照列位数储存信息的&#xff0c;跟其他文件的空格或者制表符分割很不同&#xff0c;所以也可能出现一些错误&#xff0c;比如信息错位&#xff0c;因此有必要了深入解下结构相关的格式pdb、…

进阶:PGCE中级专家认证精要

PGCE中级认证的核心价值技术深度&#xff1a;掌控未来生态PostgreSQL不仅是传统关系型数据库的标杆&#xff0c;更是云原生、AI大模型训练、物联网平台等前沿场景的核心支撑。通过PGCE认证&#xff0c;你将掌握&#xff1a;万亿级数据性能调优&#xff1a;从查询优化器原理到执…

AI增强SEO关键词表现

内容概要 随着人工智能技术的不断演进&#xff0c;其在搜索引擎优化领域展现出显著潜力&#xff0c;尤其在关键词表现优化方面发挥着核心作用。本文将从基础概念入手&#xff0c;系统探讨AI如何智能提升关键词的搜索可见性、流量吸引力和转化效率&#xff0c;从而驱动整体SEO策…

PG靶机 - PayDay

一、 初步侦察与服务探测 1.1 端口扫描与服务识别 首先&#xff0c;对目标主机 192.168.163.39 进行一次全面的端口扫描&#xff0c;以识别其上运行的各项服务。 sudo nmap 192.168.163.39 -p- --min-rate5000 -A图 1: Nmap 扫描结果&#xff0c;显示开放 80、445 和 995 等端口…

MySQLl中OFFSET 的使用方法

MySQLl中OFFSET 的使用方法基本语法SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET offset_value;number_of_rows&#xff1a;指定返回的记录数量。offset_value&#xff1a;从第几条记录开始返回&#xff08;偏移量从 0 开始计数&#xff09;。示…

监管科技(RegTech)应用:技术驱动的合规革命

目录 监管科技(RegTech)应用:技术驱动的合规革命 1. 监管科技革命:数字化合规新范式 2. 技术架构全景 2.1 现代RegTech架构 2.2 合规效率公式 3. 核心技术实现 3.1 智能合约自动化合规 3.2 AI驱动的风险监测引擎 4. 核心应用场景 4.1 KYC/AML全流程自动化 4.2 实时交易监控系…

解决SQL Server连接失败:Connection refused: connect

今天创建数据库&#xff0c;本地连接SQL Server报错&#xff1a;“通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败。错误&#xff1a;Connection refused: connect”报错图如下&#xff1a;查了一圈&#xff0c;问题出在&#xff1a;TCP/IP 没启用。如果问题和我一样&…

Windows bypassUAC 提权技法详解(一)

引言 用户账户控制&#xff08;User Account Control, 简称 UAC&#xff09;是微软自 Windows Vista 起引入的一项安全功能&#xff0c;旨在通过要求用户在执行需要管理员权限的操作时进行确认&#xff0c;从而防止未经授权的系统更改。UAC 的设计初衷是提高系统安全性&#xf…

OpenCV ------图像基础处理(一)

在 OpenCV 的图像处理世界中&#xff0c;除了图像边框处理&#xff0c;还有一些基础且重要的函数和运算&#xff0c;它们在图像编辑、融合等场景中发挥着关键作用。下面我们就来详细介绍cv2.copyMakeBorder()函数的具体参数与作用&#xff0c;以及图像加法运算和加权运算的相关…

Unity宝箱随机事件实现指南

目录 前言 一、简单的使用 新增ChestInteractableEvents&#xff0c;定义宝箱交互事件 新增Box 箱子挂载脚本&#xff0c;配置事件 运行效果 二、完善各种事件 1. 完善生成金币事件 效果&#xff0c;金币飞出 2. 完善生成敌人事件敌人 效果 3. 完善生成药水事件 效…

从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统

1. 引言&#xff1a;飞算JavaAI与实时通信技术的融合 1.1 为什么需要TCP多人聊天室&#xff1f; 在即时通讯领域&#xff0c;基于TCP协议的聊天室是理解网络编程核心概念的经典案例&#xff0c;其技术价值体现在&#xff1a; 底层协议控制&#xff1a;直接操作Socket实现可靠数…

用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手

一、为什么“单元测 ES”这么别扭&#xff1f; 测试 ES 代码时&#xff0c;最直觉的做法是连真集群做集成测试&#xff08;Docker 起个 ES&#xff09;&#xff0c;但&#xff1a; 启动 & 数据装填慢&#xff0c;不利于并行&#xff1b;网络/磁盘抖动影响稳定性&#xff1b…

《嵌入式Linux应用编程(三):Linux文件IO系统调用深度解析》

今日学习内容1. 文件IO与标准IO核心对比特性标准IO文件IO实现层C标准库Linux内核系统调用缓冲机制全缓冲/行缓冲无缓冲&#xff08;实时读写&#xff09;操作对象FILE*流指针整型文件描述符&#xff08;fd&#xff09;移植性跨平台兼容Linux特有典型应用场景普通文件操作硬件设…

数据结构之顺序表相关算法题

目录一、移除元素二、删除有序数组中的重复项三、合并两个有序数组总结一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是创建一个临时数组&#xff0c;对原数组进行遍历&#xff0c;找出与val不同的数据放到新数组里&#xff0c;然后再将tmp中的数据导回原数组 这个思…

百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行

报道显示&#xff0c;早在2012年海澜之家就开始布局数字化征程&#xff0c;并于近年对公司全流程信息化进行综合重构升级优化&#xff0c;在采销协同、业财一体等方面突破原有架构&#xff0c;通过信息化架构的增强为业务发展提供支撑。作为新零售重要组成部分的海澜电商信息化…

“Zen 5”: The AMD High-Performance 4nm x86-64 Microprocessor Core

Codenamed “Zen 5,” AMD’s next-generation, energy-efficient high-performance x86 core targets a wide array of client, server, and embedded markets. Fabricated in TSMC’s 4nm FinFET process, the 55mm2 core complex (CCX), shown in Fig. 2.1.1., contains 8.6…