堆排序——c语言实现

2023-11-06

堆的概念

堆的定义

可以定义为一颗二叉树,树的节点包含键(每个节点一个键),并且满足下面两个条件:

  1. 堆的形状要求是一颗完全二叉树,意识就是说,树的每一层都是满的,除了最后一层最右边的元素可能有缺位
  2. 父母优势要求,就是说每一个节点的键都要大于或等于它子女的键。

堆的判断

下面这个就不是堆,因为不是完全二叉树
在这里插入图片描述
下面这个也不是堆,堆的节点比子节点大,4比5小
在这里插入图片描述
下面这个是堆
在这里插入图片描述

堆的特性

在这里插入图片描述

  1. 一颗n个节点的完全二叉树。它的高度是:[log2n](log以2为底,[]表示向下取整)
  2. 堆的根总是包含堆的最大元素
  3. 堆的一个节点以及该节点的子孙也是一个堆
  4. 可以用数组来实现堆,方法是从上到下,从左到右的方式来记录堆的元素,当有n个元素时,存放在数组的1~n的位置上。此时有:
    a 父母节点会在位于数组的前n/2个位置中,而叶子节点将会在占据后n/2个位置
    b 在数组中,当父母位置为i时,则子女节点会在2i和2i+1。对于一个位于i的键来说,它的父母节点位于i/2。

堆的构造

构造堆有两种方法,一种是自底向上堆构造;另一种是自定向下堆构造。

自底向上构造

对于堆来说,每一个父母节点的值都要大于子女节点。所以从最后一个父母节点开始,一直到根节点,判断子女节点是否比父母节点的值小,如果大,则将交换父母节点和子女节点的值。
以2,9,7,6,5,8为例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自顶向下构造

自顶向下堆构造算法的效率低,就是通过把新的键连续插入预先构造好的堆,然后将其值与父母进行比较直至根节点或值小于父母节点时,来构造一个新堆。
比如在下面的堆中插入9:
在这里插入图片描述
在这里插入图片描述

关于最大堆,最小堆

最大堆就是父节点比子节点大,最小堆就是父母节点比子节点小。

堆排序

堆排序的一般过程

这里以

  1. 构造堆,堆给定的数组构造堆
  2. 删除最大键,将最大值和最后一个叶子结点进行交换,然后删除
  3. 将删除后重新整合,使之成为一个堆,重复2

堆排序样例过程图解

以2,9,7,6,5,8为例
在这里插入图片描述
在这里插入图片描述

c语言代码

#include <stdio.h>
int num;
void BuildHeap(int A[],int i,int N)	//构造堆  
{
	int c,temp;
    for (temp=A[i];2*i<=N;i=c)	//temp记录下父母节点的值,c为一个子女节点 
	{
        c=2*i;				
        if(c<N&& A[c+1]>A[c])//找到最大的子女节点 
            ++c;              
        if(temp<A[c])		//父母节点值等于子女节点中大的 
            A[i]=A[c];		
        else
            break;					
    }
    A[i]=temp;//对被交换的子女节点赋值 比如在2 9 8 6 5 7中9和2交换后,2需要和6再进行交换,最后只需要对6最开始的位置赋值2就行 
}
void Heapsort(int a[])	//排序 
	{
		int i,temp;
		for(i=num/2;i>=1;i--)	//从最后一个父母节点开始,知道根节点 
			{
				BuildHeap(a,i,num);
			}
		for(i=num;i>0;i--)	//删除根节点后,重新构造堆 
			{
				temp=a[1];
				a[1]=a[i];
				a[i]=temp;
				BuildHeap(a,1,i-1);
			}
	}
int main()
{
	printf("请输入要排序的数的个数:"); 
	scanf("%d",&num);
	int i,a[num+1];
	printf("请输入元素:");
	for(i=1;i<=num;i++)
		scanf("%d",&a[i]);
	Heapsort(a);
	for(i=1;i<=num;i++)
		printf("%d ",a[i]);
 } 

在这里插入图片描述
参考书籍:算法设计与分析基础

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆排序——c语言实现 的相关文章

  • 情感分类介绍及发展方向

    情感分类 定义 情感分析 对一段文本进行情感识别 分类 按细粒度分 文本级情感分类 判断文章的情感极性 句子级情感分类 判断句子的情感极性 方面级情感分类 判断方面的情感极性 这里的方面指的是表达感情的实体或者实体所属的种类 方面级情感分类
  • (IP地址的计算)判断两个IP是否归属于同一子网

    目录 前言 判断依据 附示例 问题 前言 今天在做题的时候做到了IP地址计算这一部分的题目 太久没有看过了 忘得都差不多了 所以就查阅了资料并做了如下笔记 帮助学习理解 同时把这道题的题目与网友分享的做法分享给大家 可以一起做一做 希望能帮

随机推荐

  • eclipse使用技巧:技巧汇总

    1 F3 转到定义 Alt 方向键 上下左右 Alt 后退 相当于vs里面的Ctrl 2 Alt 或Alt 相当于vs里面的Ctrl K p 3 Ctrl 或Ctrl 注释与反注释的时候要注意了 如果同时取消多行注释 选行要选全 4 ecl
  • error while loading shared libraries: librediscluster.so..: cannot open shared object file: No such

    很纳闷明明设置了环境变量 路径也对 可就是报找不到库 等仔细去看的时候 发现 librediscluster so 这个库多了两点 这种反人性操作真不知作者怎么想的 把librediscluster so 复制成librediscluste
  • 4G时代的语音回落

    原文地址 http ask zealer com post 211 很多小伙伴在享受国内逐步正在建成的4G网络之际可能并不知道 虽然移动通讯网络迈过了这么多年头 用手机打电话这种语音通话范畴之内的事情有单独所谓的传统 语音业务 而浏览网页
  • Devstack部署多节点Openstack(转)

    平台工具介绍 操作系统 Windows7 工具 VirtualBox 5 0 24 镜像 ubuntu 14 04 5 server amd64 iso 下载地址 ubuntu14 04 5 server版 DevStack版本 Mitak
  • 解析逻辑回归模型

    介绍 逻辑回归模型是业界运用最为广泛的模型 我们从下面几个方面讨论这个模型 1 在模型层面上 逻辑回归模型是被用来解决分类问题的 由于分类是一个非线性问题 所以建模的主要难点是如何将非线性问题转化为线性问题 主要从两方面入手 从分解问题的角
  • 如何在Pycharm中安装QT Designer+PyUIC

    如何在Pycharm中安装QT Designer PyUIC 一 安装QT 安装pyqt5 方法一 方法二 安装 pyqt5tools 方法一 方法二 二 指定Qt Designer和PyUIC 添加QtDesigner 添加PyUIC 最
  • 土木人职场受挫该如何破局?转行IT互联网貌似已成首选!

    大学毕业两年 一直在内耗 既不想继续做工程 又不知道出了工地 自己还能做什么 本人毕业于一类院校的建筑环境与能源应用工程专业 通俗的说就是土木工程 进施工单位是大部分土木人的归宿 本科毕业生很多选择去中铁 中建等国企或者央企 在外人看来 国
  • SVN/GIT源代码泄露

    造成SVN源代码漏洞的主要原因是管理员操作不规范 在使用SVN管理本地代码过程中 会自动生成一个名为 svn的隐藏文件夹 其中包含重要的源代码信息 但一些网站管理员在发布代码时 不愿意使用 导出 功能 而是直接复制代码文件夹到WEB服务器上
  • 二进制的概念及运算

    前言 有的朋友觉得写代码做开发应该就是专注于开发出功能 管这些二进制干嘛呢 尤其是做上层开发的朋友 但是当自己出去面试的时候就有可能会碰壁 或者是在看源码的时候就会懵 打个比方我们在看hashmap的源码的时候 并不是每个人都能马上算出这些
  • git使用cherry-pick操作失败,出现CHERRY-PCIKING解决方法

    如果你使用cherry pick出现以下情况 需要撤销这个操作 使用命令 git reset HEAD 1
  • Hive之快速入门

    一 什么是Hive Hive是建立在Hadoop上的数据仓库基础架构 它定义了简单的类SQL查询语句 称为HQL HQL语言也支持用户自定义SQL函数 通过MR任务来处理复杂的分析任务 Hive中包含SQL解析引擎 它会将SQL语句转换成M
  • SPSS多重响应分析案例

    SPSS多重响应分析案例 在市场调查问卷中 总会设计一部分多项选择题 对于多选题 一般采用频数分析 SPSS提供了专门的多选题频数分析统计分析功能 调查问卷 您拥有以下哪些品牌的贵宾卡 1 班尼路 2 真维斯 3 佐丹奴 4 堡师龙 5 苹
  • C# object介绍

    C object介绍 Object类是C 语言仲最原始 最重要得类 是所有类得 祖先 每个C 类都是它得子类 它实现了每个类都必须具有得基本方法 在 Object 类中提供了 4 个常用的方法 即 Equals GetHashCode Ge
  • $(MAKE) -C $(KERNELDIR) M= $(PWD) modules

    转载于 http blog chinaunix net xmlrpc php r blog article uid 29523795 id 4209690 在mini2440资料的LED驱动编程的编译makefile里面看到这样一句话 C是
  • 【华为OD机试 2023】士兵过河(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 【S-排序】python实现八大排序算法之10-基数排序(RadixSort)

    基数排序 基本思想 基数排序 Radix Sort 是桶排序的扩展 将整数按位数切割成不同的数字 然后按每个位数分别进行了多轮的桶排序 具体实现 从低位开始将待排序的数按照这一位的值放到相应的编号为0 9的桶中 等到低位排完得到一个子序列
  • type-aliases-package不生效问题记录

    项目场景 在mapper xml文件里 我们可能需要用到别名 需要在yml进行配置 mybatis mapperLocations classpath mapper xml type aliases package com example
  • 脚本安装docker 错误解决

    一 脚本安装 CentOS系统上可以使用此脚本进行安装 如下 root localhost curl sSL get docker com o get docker sh root localhost sh get docker sh mi
  • 黑苹果更新后无法开机的拯救思路

    实例 我的黑苹果osx 10 8 5 前段时间app store提示更新smc 我一看发现是黑苹果敏感部件就没更新 谁知重启后依然悲剧 提示fakeSMC出现某个错误 不能开机了 在走了几个弯路后 我总结了下面的方法 首先进win 用mac
  • 堆排序——c语言实现

    文章目录 堆的概念 堆的定义 堆的判断 堆的特性 堆的构造 自底向上构造 自顶向下构造 关于最大堆 最小堆 堆排序 堆排序的一般过程 堆排序样例过程图解 c语言代码 堆的概念 堆的定义 堆可以定义为一颗二叉树 树的节点包含键 每个节点一个键