经典排序算法(7)——堆排序算法详解

堆排序(Heap sort)是指利用堆(最大堆、最小堆)这种数据结构所设计的一种排序算法。堆是一个完全二叉树的结构,并同时满足如下性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

一、算法基本思想

(1)基本思想

堆排序的基本思想就是:从最大(小)堆得顶部不断取走堆顶元素放到有序序列中,直到堆的元素被全部取完。堆排序完全依赖于最大(小)堆的相关操作。


(2)运行过程

堆排序算法的运作如下:

1、创建一个最大(小)堆H;

2、把堆首和堆尾元素互换;

3、把堆的大小减1,重新构造一个最大(小)堆;

4、重复步骤2、3,直到堆的大小减少为1。

(3)示例

最大堆的构建:

堆排序过程:



二、算法实现(核心代码)

C++实现:

#include <iostream>
#include <algorithm>
using namespace std;void max_heapify(int arr[], int start, int end) {//建立父節點指標和子節點指標int dad = start;int son = dad * 2 + 1;while (son < end) { //若子節點指標在範圍內才做比較if (son + 1 < end && arr[son] < arr[son + 1]) //先比較兩個子節點大小,選擇最大的son++;if (arr[dad] > arr[son]) //如果父節點大於子節點代表調整完畢,直接跳出函數return;else { //否則交換父子內容再繼續子節點和孫節點比較swap(arr[dad], arr[son]);dad = son;son = dad * 2 + 1;}}
}void heap_sort(int arr[], int len) {//初始化,i從最後一個父節點開始調整for (int i = len / 2 - 1; i >= 0; i--)max_heapify(arr, i, len);//先將第一個元素和已排好元素前一位做交換,再從新調整,直到排序完畢for (int i = len - 1; i > 0; i--) {swap(arr[0], arr[i]);max_heapify(arr, 0, i);}
}int main() {int arr[] = { 4, 1, 3, 2, 16, 9, 10, 14, 8, 7};int len = (int) sizeof(arr) / sizeof(*arr);heap_sort(arr, len);for (int i = 0; i < len; i++)cout << arr[i] << ' ';cout << endl;return 0;
}

三、性能(算法时间、空间复杂度、稳定性)分析

堆排序的时间复杂度为O(nlogn)空间复杂度为O(1);是不稳定的排序算法

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

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

相关文章

经典排序算法(8)——归并排序算法详解

归并排序&#xff08;Merge sort&#xff09;&#xff0c;是创建在归并操作上的一种有效的排序算法&#xff0c;效率为O(nlog n)。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;且各层分治递归可以同时进行。 一、算法基本思…

祝贺王远当选为中国区第二位 Teams MVP

今天一上班就传来喜讯&#xff0c;Microsoft Teams 大中华区技术社区专家委员会成员之一的王远成功当选了2020-2021年度微软最有价值专家&#xff08;MVP)&#xff0c;这是对他在基于Office 365的音视频会议系统&#xff08;尤其是在Microsoft Teams&#xff09;方面的深入研究…

经典排序算法(9)——桶排序算法详解

桶排序&#xff08;Bucket sort&#xff09;或所谓的箱排序&#xff0c;并不是比较排序&#xff0c;它不受到 O(nlogn) 下限的影响。 一、算法基本思想 &#xff08;1&#xff09;基本思想 桶排序工作的原理是将数组分到有限数量的桶子里&#xff0c;每个桶子再个别排序&#x…

[原]排错实战——使用process explorer替换任务管理器

前言 一般&#xff0c;我们会使用任务管理器查看系统中有哪些进程在运行&#xff0c;强制杀掉某个进程。可是系统自带的任务管理器功能有限&#xff0c;process explorer是一个功能更强大的工具。它可以让我们查看更多更详细的信息&#xff08; 比如查看某个进程的父进程&#…

ABP vNext中使用开源日志面板 LogDashboard

ABP vNext 使用 logdashboard本文示例源码&#xff1a;https://github.com/liangshiw/LogDashboard/tree/master/samples/abpvnextABPABP是aspnetcore3.0的开源web应用程序框架&#xff0c;非常适合现代web应用程序。有关ABP的更多内容可以查看官方文档Logdashboard可以直接在基…

经典排序算法(10)——基数排序算法详解

基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。 一、算法基本思想 &#xff08;1&#xff09;基本思想 基数排序是基于桶排序来实现。通过键值的部分信息&#…

经典排序算法(11)——计数排序算法详解

计数排序&#xff08;Counting sort&#xff09;是一个非基于比较的排序算法&#xff0c;该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时&#xff0c;它的复杂度为Ο(nk)&#xff08;其中k是整数的范围&#xff09;&#xff0c;快于任何比较…

GitHub Actions,卧槽!牛批!

“ 阅读本文大概需要 19 分钟。 ”前段时间我更新了我的分布式爬虫管理框架—— Gerapy&#xff08;话都说到这儿了打个广告&#xff0c;跟繁琐的命令行说拜拜&#xff01;Gerapy分布式爬虫管理框架来袭&#xff01;&#xff0c;哇&#xff0c;哇&#xff0c;就是&#xff0c;哇…

平衡二叉树AVL详解

一、平衡二叉树的定义 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;又被称为AVL树&#xff0c;它且具有以下性质&#xff1a; &#xff08;1&#xff09;它是一棵空树或它的左右两个子树的高度差的绝对值不超过1&#xff1b; &#xff08;2&#xff09;并且左右两个…

【壹个小技巧】一看就会的CI/CD :Github Actions

什么是 CI/CD?我这里先不说概念&#xff0c;先说一个平时开发的场景问题&#xff1a;我们平时开发一个项目&#xff0c;经常会遇到这些“小”问题&#xff1a;就是如何保证自己的项目是正确的&#xff0c;至少拿给别人的时候&#xff0c;可以编译运行的&#xff1f;或者说多人…

Hyper-V虚拟机自动添加检查点和导出备份

背景说明笔者使用Hyper-V在内部搭建了大量的环境和系统&#xff0c;比如&#xff1a;k8s内部集群Azure Devops Server(TFS>VSTS>Azure Devops Server)SharePoint…大部分基本上都是用于内部研究、测试等场景&#xff0c;但是为了避免很多麻烦&#xff0c;必要的备份还是必…

哈夫曼树详解

一、哈夫曼树的定义 &#xff08;1&#xff09;简单路径长度 所谓树的简单路径长度&#xff0c;是指从树的跟节点到每个节点的路径长度之和。 完全二叉树是简单路径长度更小的二叉树。 &#xff08;2&#xff09;加权路径长度 所谓树的加权路径长度&#xff0c;是指树中所以带…

深入理解.NET Core的基元(三) - 深入理解runtimeconfig.json

原文&#xff1a;Deep-dive into .NET Core primitives, part 3: runtimeconfig.json in depth作者&#xff1a;Nate McMaster[1]译文&#xff1a;深入理解.NET Core 的基元&#xff08;三&#xff09; - 深入 runtimeconfig.json作者&#xff1a;Lamond Lu前情回顾深入理解.NE…

B-树、B+树、B*树详解

一、B树 B树是一种多路搜索树&#xff08;并不是二叉的&#xff09;&#xff0c;性质如下&#xff1a; 1、定义任意非叶子结点最多只有M个儿子&#xff1b;且M>2&#xff1b; 2、根结点的儿子数为[2, M]&#xff1b; 3、除根结点以外的非叶子结点的儿子数为[M/2, M]&#…

微软正在开发基于Rust的安全编程语言

此前&#xff0c;微软表示正探索将 Rust 作为 C 和 C 的安全替代方案&#xff0c;并且也对外展示了使用 Rust 重写 Windows 组件的体验。根据微软的说法&#xff0c;Rust 是一种从根本上考虑安全性的编程语言&#xff0c;他们将尝试使用 Rust 重写各种产品&#xff0c;因为在过…

堆树(最大堆、最小堆)详解

一、堆树的定义 堆树的定义如下&#xff1a; &#xff08;1&#xff09;堆树是一颗完全二叉树&#xff1b; &#xff08;2&#xff09;堆树中某个节点的值总是不大于或不小于其孩子节点的值&#xff1b; &#xff08;3&#xff09;堆树中每个节点的子树都是堆树。 当父节点的键…

HttpClientFactory日志不好用,自己扩展一个?

前言.NetCore2.1新推出HttpClientFactory工厂类&#xff0c; 替代了早期的HttpClient&#xff0c;并新增了弹性Http调用机制 (集成Policy组件)。替换的初衷还是简单说下&#xff1a;① using(var client new HttpClient()) 调用Dispose()方法&#xff0c;并不会很快释放底层So…

树、二叉树简介

一、树的定义 树是由n&#xff08;n>1&#xff09;个有限节点组成一个具有层次关系的集合&#xff0c;它有如下特点&#xff1a; 1、每个节点有零个或多个子节点&#xff1b; 2、没有父节点的节点称为根节点&#xff1b; 3、每一个非根节点有且只有一个父节点&#xff1b; 4…

Quartz.net定时任务的使用及获取正在运行的JOB

定时任务管理类实现了如下功能&#xff1a;1、对定时任务进行管理 2、创建定时任务&#xff0c;需要给定时任务一个job的名称 3、判断给定的job的任务是否已存在 4、停止定时任务的功能namespace MyUKD.Quartz{ public class QuartzSchedulerMgr { private static readonly ILo…

漫谈认证与授权

漫谈认证与授权Intro认证与授权一直以来都是很多人在讨论的话题&#xff0c;之所以想这次谈一谈认证和授权&#xff0c;主要是因为最近看到许多文章都把认证和授权混为一谈&#xff0c;把认证方式当作是授权方式。所以想写篇文章谈谈我眼中的认证与授权。Authentication什么是认…