堆排序算法

目录

  • 1.基本原理
  • 2.例子
  • 3.代码实现

本文主要介绍堆排序的原理、例子以及代码实现。

1.基本原理

堆排序(Heap Sort)是一种基于比较的排序算法,它的工作原理是首先将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素和最后一个元素,然后将剩余元素重新调整为大顶堆或小顶堆,再交换堆顶元素和最后一个元素,如此反复,直到所有元素都排好序。

堆排序的步骤如下:

  1. 构造大顶堆(或小顶堆),对于每一个非叶子节点,保证其值大于(或小于)其子节点的值。
  2. 将堆顶元素与最后一个元素交换,然后将剩余元素重新调整为大顶堆(或小顶堆)。
  3. 重复步骤2,直到所有元素都排好序。

堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。

2.例子

假设我们有一个待排序的数组 [4, 10, 3, 5, 1],我们想要对其进行升序排序,可以使用堆排序,具体步骤如下:

  1. 首先,我们将数组构造成一个大顶堆。大顶堆是一种满足父节点的值大于或等于其子节点值的二叉树。构造大顶堆后,数组变为 [10, 5, 3, 4, 1]。
  2. 然后,我们将堆顶元素(即当前最大的元素10)与最后一个元素1交换位置,然后将剩余的元素(即除去最后一个元素的其他元素)重新调整为大顶堆。交换并调整后,数组变为 [5, 4, 3, 1] 和 [10]。
  3. 我们再次将堆顶元素5与最后一个元素1交换位置,然后将剩余的元素重新调整为大顶堆。交换并调整后,数组变为 [4, 1, 3]、[5, 10]。
  4. 重复上述步骤,直到所有元素都排好序,最终得到的数组为 [1, 3, 4, 5, 10]。

以上就是一个堆排序的具体例子。

3.代码实现

以下是堆排序的C语言实现:

#include <stdio.h>void swap(int *a, int *b) {int t = *a;*a = *b;*b = t;
}void heapify(int arr[], int n, int i) {int largest = i;int left = 2*i + 1;int right = 2*i + 2;if (left < n && arr[left] > arr[largest])largest = left;if (right < n && arr[right] > arr[largest])largest = right;if (largest != i) {swap(&arr[i], &arr[largest]);heapify(arr, n, largest);}
}void heapSort(int arr[], int n) {for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);for (int i=n-1; i>=0; i--) {swap(&arr[0], &arr[i]);heapify(arr, i, 0);}
}void printArray(int arr[], int n) {for (int i=0; i<n; ++i)printf("%d ", arr[i]);printf("\n");
}int main() {int arr[] = {12, 11, 13, 5, 6, 7};int n = sizeof(arr)/sizeof(arr[0]);heapSort(arr, n);printf("Sorted array is \n");printArray(arr, n);
}

在这段代码中,heapify 函数用于构造大顶堆,heapSort 函数用于进行堆排序,swap 函数用于交换两个元素的值,printArray 函数用于打印数组。

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

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

相关文章

HCIP —— 双点重发布 + 路由策略 实验

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 实验配置&#xff1a; 1.配置IP地址 2.配置动态路由协议 —— RIP 、 OSPF R1 RIP R4 OSPF R2 配置RIP、OSPF 双向重发布 R3配置RIP、OSPF 双向重发布 3.查询路由表学习情况 4.使用路由策略控制选路 R2 R3 5.检…

C/C++ 快速排序

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 快速排序的思想——分治 目录 一、引言 二、讲解 1、步骤 2、代码 1.以左边界作为基准 2.以右边界作为基准 3.以中心点作为基准 …

Linux shell编程学习笔记32:declare 命令

0 前言 在 Linux shell编程学习笔记16&#xff1a;bash中的关联数组https://blog.csdn.net/Purpleendurer/article/details/134053506?spm1001.2014.3001.5501 中&#xff0c;我们在定义关联数组时使用了declare命令。 其实&#xff0c;declare命令的功能不只是定义定义关…

排序算法介绍(三)选择排序

0. 简介 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。选择排序是不稳…

超大规模集成电路设计----学习框架(一)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----学习框架&#xff08;一&#xff09; 这门课在学什么&#xff1f;这门课该怎么学&#xf…

PostgreSQL中常用的几种连接池总结及更新

前言 PostgreSQL的多进程结构&#xff0c;使得在支持大规模连接的时候&#xff0c;服务器端显得比较吃亏。一般上了1000个连接以上的时候&#xff0c;系统就会受到很大影响。这个时候&#xff0c;使用连接池&#xff0c;优势就会突显出来了。 在云环境下&#xff0c;一个JAVA…

Redis quicklist源码+listpack源码(5.0版本以上的优化)

ziplist设计上的问题&#xff0c;每一次增删改都需要计算前面元素的空间和长度&#xff08;prevlen&#xff09;&#xff0c;这种设计缺陷非常明显&#xff0c;因此引入了quicklist的设计。 quicklist quicklist实际就是双端链表&#xff0c;链表里的每一个节点都是ziplist&a…

Python---函数递归---练习:猴子吃桃问题(本文以递归算法 解法为主)

相关链接&#xff1a;Python---函数递归---练习&#xff1a;斐波那契数列&#xff08;本文以递归算法为主&#xff09;-CSDN博客 案例&#xff1a;猴子吃桃问题 猴子吃桃问题。猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。…

类和对象——(5)定义对象数组

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 芳华没有草稿纸&#xff0c;我们永久不…

曲线积分和路径无关条件和应用

文章目录 平面上曲线积分和路径无关条件曲线积分与路径无关的定义等价描述小结充要条件定理充分性必要性 说明 线积分与路径无关时的计算&#x1f47a;曲线积分与路径无关的三个等价命题等价结论 Newton-Leibniz二元函数形式积分路径的简化 应用例例 平面上曲线积分和路径无关条…

UVa1584环状序列题解

题目 长度为n的环状串有n种表示方法&#xff0c;分别为从某个位置开始顺时针得到&#xff0c;在这些排列中字典顺序最小的称“最小表示”。 如CTCC的最小表示为CCCT&#xff0c;CGAGTCAGCT的最小表示为AGCTCGAGTC。 提示&#xff1a;对于两个字符串&#xff0c;从第一个字符开始…

openEuler学习05-ssh升级到openssh-9.5p1

openEuler的版本是openEuler 20.03&#xff0c;ssh的版本是OpenSSH_8.2p1 [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好&#xff0c;最近在搞论文所以在研究各种论文的思想&#xff0c;这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布&#xff0c;其主要的核心思想是&#xff1a;基于多层感知机&#xff08;MLP&#xff09;构建的编码器-解码器架构&#xff0c;核心创…

Python---函数递归---练习:斐波那契数列(本文以递归算法为主)

编程思想&#xff1a; 如何利用数学模型&#xff0c;来解决对应的需求问题&#xff1b;然后利用代码实现对应的数据模型。 算法&#xff1a;使用代码实现对应的数学模型&#xff0c;从而解决对应的业务问题 程序 算法 数据结构 在经常使用的算法中&#xff0c;有两种非常…

RC低通滤波电路直接带载后会发生什么?

1、滤波的含义 滤波是频域范畴&#xff0c;它说的是不同频率的信号经过一个电路处理后&#xff0c;信号发生变化的问题&#xff0c;变化包含了原始信号幅值和相位的变化&#xff0c;滤波电路对信号的幅值做出的响应称为幅频响应&#xff0c;对信号相位做出的反应称为相频响应。…

设计模式---第五篇

系列文章目录 文章目录 系列文章目录前言一、知道观察者模式吗?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、知道观察者模式吗? 答:观察者模式是定义对…

逸学java【初级菜鸟篇】12.网络通讯编程

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 请练掌网络通讯的内容。 局域网和互联网 局域网英文&#xff1a;Local Area Network&#xff0c;缩写&#xff1a;LAN&#xff0c;是指一群通过一定形式连接起来的计算机&#xff0c;…

Java封装讯飞星火大模型历险记

问题描述与分析 现状描述与目标 在使用讯飞星火大模型API的过程中&#xff0c;API的返回结果在可以在其他线程中进行分次打印&#xff0c;但是在main方法中直接打印返回结果&#xff0c;显示为空。这种情况下不利于二次封装&#xff0c;希望在main方法中获取完整的API返回结果…

Linux——基本指令(一)

写在前面&#xff1a; 我们云服务器搭建的Linux系统&#xff0c;使用的镜像版本CentOS 7.6,使用的Xshell远程连接云服务器 前面我们使用超级管理员root账号登录&#xff0c;一般我们使用普通用户登录&#xff0c;那么如何创建新用户呢&#xff1f; 1.创建新用户 &#xff08…

Ubuntu22.04无需命令行安装中文输入法

概要&#xff1a;Ubuntu22.04安装完成后&#xff0c;只需在设置中点点点即可完成中文输入法的安装&#xff0c;无需命令行。 一、安装中文语言包 1、点击屏幕右上角&#xff0c;如下图所示。 2、点击设置 3、选择地区与语言&#xff0c;点击管理已安装的语言 4、点击安装 5、输…