【排序算法】推排序算法解析:从原理到实现

目录

1. 引言

2. 推排序算法原理

3. 推排序的时间复杂度分析

4. 推排序的应用场景

5. 推排序的优缺点分析

5.1 优点:

5.2 缺点:

6. Java、JavaScript 和 Python 实现推排序算法

6.1 Java 实现:

6.2 JavaScript 实现:

6.3 Python 实现:

7. 总结


1. 引言

        推排序(Heap Sort)是一种高效的排序算法,其核心思想是利用堆数据结构进行排序。本文将从原理、时间复杂度、应用场景、优缺点等方面深入探讨推排序算法,并通过 Java、JavaScript 和 Python 三种编程语言的示例进行说明。

2. 推排序算法原理

        推排序算法的核心思想是利用堆数据结构进行排序。在推排序中,首先将待排序序列构建成一个最大堆或最小堆,然后进行堆排序,每次取出堆顶元素,再调整剩余元素的堆结构,直到所有元素都被取出,即完成排序。

推排序的步骤如下:

  1. 构建堆:将待排序序列构建成一个最大堆或最小堆。
  2. 堆排序:重复从堆顶取出元素,调整剩余元素的堆结构,直到所有元素都被取出,即完成排序。

3. 推排序的时间复杂度分析

         推排序算法的时间复杂度取决于构建堆和堆排序两个步骤。在构建堆的过程中,需要对序列中的每个元素进行上浮或下沉操作,时间复杂度为O(n);在堆排序的过程中,需要执行n次堆调整操作,时间复杂度为O(n log n)。因此,推排序的总时间复杂度为O(n log n)。

4. 推排序的应用场景

       推排序算法适用于各种数据类型和数据规模的排序问题,特别适合处理大规模数据。由于推排序的时间复杂度较低,因此在需要高效率排序的场景下广泛应用。

5. 推排序的优缺点分析

5.1 优点:

  • 时间复杂度低:推排序的时间复杂度为O(n log n),效率较高。
  • 稳定性:推排序是一种稳定的排序算法,相同元素的相对位置不会改变。
  • 适用性广泛:推排序适用于各种数据类型和数据规模,特别适合处理大规模数据。

5.2 缺点:

  • 需要额外的空间:推排序需要额外的空间来存储堆结构,因此在内存有限的情况下可能会受到限制。
  • 不适合小规模数据:推排序在处理小规模数据时可能效率较低,因为堆的构建需要较多的比较和交换操作。

6. Java、JavaScript 和 Python 实现推排序算法

6.1 Java 实现:

import java.util.Arrays;public class HeapSort {public static void heapSort(int[] arr) {int n = arr.length;// Build heap (rearrange array)for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);// One by one extract an element from heapfor (int i = n - 1; i > 0; i--) {// Move current root to endint temp = arr[0];arr[0] = arr[i];arr[i] = temp;// call max heapify on the reduced heapheapify(arr, i, 0);}}// To heapify a subtree rooted with node i which is// an index in arr[]. n is size of heappublic static void heapify(int[] arr, int n, int i) {int largest = i; // Initialize largest as rootint left = 2 * i + 1; // left = 2*i + 1int right = 2 * i + 2; // right = 2*i + 2// If left child is larger than rootif (left < n && arr[left] > arr[largest])largest = left;// If right child is larger than largest so farif (right < n && arr[right] > arr[largest])largest = right;// If largest is not rootif (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;// Recursively heapify the affected sub-treeheapify(arr, n, largest);}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6, 7};heapSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

6.2 JavaScript 实现:

function heapSort(arr) {let n = arr.length;// Build heap (rearrange array)for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {heapify(arr, n, i);}// One by one extract an element from heapfor (let i = n - 1; i > 0; i--) {// Move current root to endlet temp = arr[0];arr[0] = arr[i];arr[i] = temp;// call max heapify on the reduced heapheapify(arr, i, 0);}
}// To heapify a subtree rooted with node i which is
// an index in arr[]. n is size of heap
function heapify(arr, n, i) {let largest = i; // Initialize largest as rootlet left = 2 * i + 1; // left = 2*i + 1let right = 2 * i + 2; // right = 2*i + 2// If left child is larger than rootif (left < n && arr[left] > arr[largest]) {largest = left;}// If right child is larger than largest so farif (right < n && arr[right] > arr[largest]) {largest = right;}// If largest is not root

6.3 Python 实现:

def heapify(arr, n, i):largest = i  # Initialize largest as rootleft = 2 * i + 1  # left = 2*i + 1right = 2 * i + 2  # right = 2*i + 2# If left child is larger than rootif left < n and arr[left] > arr[largest]:largest = left# If right child is larger than largest so farif right < n and arr[right] > arr[largest]:largest = right# If largest is not rootif largest != i:arr[i], arr[largest] = arr[largest], arr[i]  # Swap# Recursively heapify the affected sub-treeheapify(arr, n, largest)def heapSort(arr):n = len(arr)# Build a maxheap.for i in range(n // 2 - 1, -1, -1):heapify(arr, n, i)# One by one extract elementsfor i in range(n - 1, 0, -1):arr[i], arr[0] = arr[0], arr[i]  # Swapheapify(arr, i, 0)arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
print("Sorted array:", arr)

7. 总结

        通过本文的介绍,我们对推排序算法有了更深入的理解。从原理到实现,再到时间复杂度分析、应用场景、优缺点等方面,我们对推排序算法有了全面的认识。同时,通过用 Java、JavaScript 和 Python 三种编程语言实现推排序算法,我们加深了对这些语言特性和语法的理解,提高了编程能力。

        推排序算法是一种高效的排序算法,在处理大规模数据时表现良好。它适用于各种数据类型和数据规模的排序问题,特别适合处理大规模数据。

        希望本文能够帮助读者更好地理解推排序算法,并在实践中灵活运用,解决实际问题。同时也希望读者能够继续深入学习和探索,不断提升自己的算法能力和编程技术。

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

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

相关文章

K8S之实现业务的金丝雀发布

如何实现金丝雀发布 金丝雀发布简介优缺点在k8s中实现金丝雀发布 金丝雀发布简介 金丝雀发布的由来&#xff1a;17 世纪&#xff0c;英国矿井工人发现&#xff0c;金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯&#xff0c;金丝雀也会停止歌唱&#xff1b;当瓦斯…

【JS逆向学习】猿人学 第五题 js混淆 乱码

逆向目标 网址&#xff1a;https://match.yuanrenxue.cn/match/5接口&#xff1a;https://match.yuanrenxue.cn/api/match/5?page2&m1709806560791&f1709806560000参数&#xff1a; Cookie(m、RM4hZBv0dDon443M)payload(m、f) 逆向过程 老规矩&#xff0c;上来先分…

第24集《灵峰宗论导读》

请大家打开讲义第79面。 在第一段呢蕅益大师先讲到这个诸法实相的妙理&#xff0c;说从我们现前一念心性来观察诸法实相有两个角度&#xff1a; 第一个角度呢就是当我们摄用归体的时候&#xff0c;所谓万法唯识一心的时候&#xff0c;这个时候我们会发觉三世诸佛&#xff0c;…

vue实现文字手工动态打出效果

vue实现文字手工动态打出效果 问题背景 本文实现vue中&#xff0c;动态生成文字手动打出效果。 问题分析 话不多说&#xff0c;直接上代码&#xff1a; <template><main><button click"makeText"><p class"text">点击生成内容…

启动vue项目执行npm run serve报错 : error in ./src/element-variables.scss

error in ./src/element-variables.scss 问题原因 node-sass的版本问题 解决方式 我直接更新了一下node-sass&#xff0c;就好了 npm install node-sass 再次执行就可以执行成功了

如何设置WhatsApp Business账号?

WhatsApp Business是WhatsApp为企业打造的一款应用程序&#xff0c;旨在帮助企业与客户更轻松地互动。如果您是一家出海企业&#xff0c;想要更好地与客户沟通&#xff0c;那么WhatsApp Business账号是您不可或缺的工具。 以下是设置WhatsApp Business账号的步骤&#xff1a; …

AIGC绘画关键词 - 写实少女

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

MongoDB黑窗口操作(CRUD)

目录 连接数据库 插入数据 for循环插入数据 根据条件查询 修改数据 删除数据 连接数据库 对应路径下cmd中输入命令mongo即可 插入数据 j{name:"mongo"} t{x:3} 提交&#xff1a;db.things.svae(j);db.things.svae(t); 查询&#xff1a;db.things.find(); …

Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种

线程创建之源 OK&#xff01;咱们闲话少叙&#xff0c;直接进入正题&#xff0c;回顾一下通过实现Runnable接口&#xff0c;重写run方法创建线程的方式&#xff0c;真的可以创建一个线程吗&#xff1f;来看下面这段demo。 【代码示例1】 public class Test implements Runnab…

信号处理--使用CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 睡眠对人体健康很重要。监测人体的睡眠分期对于人体健康和医疗具有重要意义。 亮点 架构在第一层使用两个具有不同滤波器大小的 CNN 和双向 LSTM。 CNN 可以被训练来学习滤波器&#xff0c;以从原始…

redis缓存(穿透, 雪崩, 击穿, 数据不一致, 数据并发竞争 ), 分布式锁(watch乐观锁, setnx, redission)

redis的watch缓存机制 WATCH 机制原理&#xff1a; WATCH 机制&#xff1a;使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况&#xff0c;如果有key 的 value 值在事务 EXEC 执行之前被修改了&#xff0c;整个事务被取消。EXEC 返回提示信息&#xff0c;表示 事务已…

Linux安装,配置,启动HBase

Linux安装&#xff0c;配置&#xff0c;启动HBase 一、HBase安装&#xff0c;配置 1、下载HBase安装包 Hbase官方下载地址: http://archive.apache.org/dist/hbase 选择相应的版本点击下载&#xff0c;这里以2.3.5为例 # linux可以通过wget命令下载 wget https://archive…

Windows11安装FFmpeg最新版本

打开终端: 输入 winget install ffmpeg 然后输入 Y 回车后出现如下图: 正在下载FFmpeg 6.1 安装成功 测试

STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法

STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法前言第1章 配置ST-LINK下载器第2章 配置DAP下载器总结 前言 这个软件编译完之后&#xff0c;可以使用下载器进行在线下载程序或仿真调试程序&#xff0c;也…

050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

050-WEB攻防-PHP应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒 #知识点&#xff1a; 1、文件包含-原理&分类&危害-LFI&RFI 2、文件包含-利用-黑白盒&无文件&伪协议 演示案例&#xff1a; ➢文件包含-原理&分类&am…

设计模式(工厂模式)

设计模式&#xff08;工厂模式&#xff09; 一、工厂模式介绍 在工厂模式中&#xff0c;父类决定生成示例的方式&#xff0c;但不决定所要生成的具体的类&#xff0c;具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。 二、示例程序 以下示例程…

力扣-数组题

1. 两数之和 找出map中是否有target-nums[i]&#xff0c; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i 0 ;i < nums.size(); i){if(hash.find(target - nums[i]) ! hash…

MongoDB安装教程(附带安装包)

目录 解压安装包 傻瓜式安装 选择安装目录 安装完成 启动验证 验证成功 解压安装包 选择所需要的进行安装 傻瓜式安装 选择安装目录 安装完成 启动验证 mongod --dbpathD:\mongodb\data\db 验证成功

VUE_自适应布局lib-flexible+postcss-pxtorem、lib-flexible + postcss-px2rem,nuxt页面自适配

lib-flexible postcss-pxtorem适配 我采用的是flexable.js和postcss-pxtorem。我一开始用的是postcss-px2rem后来发现和nuxt引入公共css的时候发生了冲突所以改用了postcss-pxtorem。 安装依赖 npm i lib-flexible -S npm install postcss-pxtorem --save 1、lib-flexible.…

FreeRTOS学习笔记——列表和列表项及其API函数讲解

目录 精华总结&#xff1a; 列表和列表项 架构脑图&#xff1a; 列表和列表项的简介 列表的结构 列表项 迷你列表项 列表和列表项的关系 FreeRTOS 列表和列表项相关 API 函数 架构脑图&#xff1a; 列表和列表项相关 API 函数 函数 vListInitialise() 函数 vListIni…