堆排序与

二叉堆的定义

二叉堆是完全二叉树或者是近似完全二叉树。

二叉堆满足二个特性:

1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。

2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。

当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:

由于其它几种堆(二项式堆,斐波纳契堆等)用的较少,一般将二叉堆就简称为堆。

堆的存储

一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。

堆的操作——插入删除

下面先给出《数据结构C++语言描述》中最小堆的建立插入删除的图解,再给出本人的实现代码,最好是先看明白图后再去看代码。

堆的插入

每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于直接插入排序中将一个数据并入到有序区间中,对照《直接插入排序的三种实现》不难写出插入一个新数据时堆的调整代码:

//  新加入i结点  其父结点为(i - 1) / 2

void MinHeapFixup(int a[], int i)

{

int j, temp;

temp = a[i];

j = (i - 1) / 2;      //父结点

while (j >= 0)

{

if (a[j] <= temp)

break;

a[i] = a[j];    //把较大的子结点往下移动,替换它的子结点

i = j;

j = (i - 1) / 2;

}

a[i] = temp;

}

更简短的表达为:

void MinHeapFixup(int a[], int i)

{

for (int j = (i - 1) / 2; j >= 0 && a[i] > a[j]; i = j, j = (i - 1) / 2)

Swap(a[i], a[j]);

}

插入时:

//在最小堆中加入新的数据nNum

void MinHeapAddNumber(int a[], int n, int nNum)

{

a[n] = nNum;

MinHeapFixup(a, n);

}

linux 堆地址,堆与堆排序_Linux编程_Linux公社-Linux系统门户网站相关推荐

  1. 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站

    外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站 之前在CentOS虚拟机上安装了LAMP,搭建起了自己的web服务器,具体流程见: http://www.lin ...

  2. 给linux内核传递数组,数组与指针 - Linux C编程实战之路_Linux编程_Linux公社-Linux系统门户网站...

    谈到C语言编程,数组和指针是很多人的心头大石,总觉得它们是重点难点,重点是没错的,但绝不是什么难点,要说C语言的难点,客观地讲应该是带参宏,而数组和指针,概念浅显易懂,操作简洁方便,根本不是很多初学者 ...

  3. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...

    2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...

  4. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  5. linux通过信号回调函数,信号机制的管理结构 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

    信号只是一个数字,数字为0-31表示不同的信号,如下表所示. 编号 信号名 默认动作 说明 1 SIGHUP 进程终止 终端断开连接 2 SIGINT 进程终止 用户在键盘上按下CTRL+C 3 SI ...

  6. 显示驱动包含在Linux内核层,驱动程序层(上) - Linux内核--网络栈实现分析_Linux编程_Linux公社-Linux系统门户网站...

    经过前面两篇博文的分析,已经对Linux的内核网络栈的结构有了一个模糊的认识,这里我们开始从底层开始详细分析Linux内核网络栈的实现.由于这是早期版本,代码的层次隔离做的还不是很好,这里说是从底层分 ...

  7. 内存模型 linux,内存模型 - STM32F4 编程手册学习_Linux编程_Linux公社-Linux系统门户网站...

    STM32F4编程手册学习2_内存模型 1. 内存映射 MCU将资源映射到一段固定的4GB可寻址内存上,如下图所示. 内存映射将内存分为几块区域,每一块区域都有一个定义的内存类型,一些区域还有一些附加 ...

  8. s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...

    1.这里为什么选nfs文件系统呢? 在产品开发阶段,因为nfs根文件系统并不需要编译进内核,方便调试. 2.制作根文件系统需要用到BusyBox 解压进入busybox目录: root@linuxid ...

  9. linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

    1.简介 如果进程要处理某一信号,那么要在进程中注册该信号.注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作.主要有两个函 ...

最新文章

  1. PHP 年龄计算函数
  2. 京东横刀,堵了拼多多“升级”的路
  3. android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
  4. 磁盘 I/O 性能监控指标和调优方法
  5. jetty部署多个web应用及将jetty配置成服务
  6. mysql中的派生表
  7. @ControllerAdvice全局异常处理不起作用原因及解决办法
  8. HDU 1233 - 还是畅通工程
  9. 远程执行python脚本_python 远程执行服务器上的脚本
  10. 华为hwics格式产品文档打开方式
  11. android关机铃声代码,android系统添加关机铃声
  12. java 信鸽推送demo_iOS中关于信鸽推送的使用demo详解
  13. 移动宽带覆盖小区查询 (广东范围)
  14. 概率空间probability space 伯努利实验 n次伯努利实验
  15. “春节游”还准备去海外猎食新鲜?麻烦!家门口明明啥都有!
  16. 36岁的it一线运维是不是废了_35以上IT人咋活?给你三个真实的案例
  17. visio 中取消 交叉连接线的拱形的方法
  18. JSP-学生管理系统
  19. 输入关键字的爬虫方法(运行环境python3)
  20. 魅族手机里的便签怎么导出转移到新的手机上?

热门文章

  1. 用数据分析的指标拆解思路如何从股市了解市场
  2. 如何界定目标和理想?
  3. 2019年9月-最新2000个国内高匿代理ip
  4. Java编写一个计算各种形状的面积和周长的程序
  5. 计算机毕业设计之java+ssm直销模式下家具工厂自建网站
  6. 凯迪生态携手海通安恒,成功启动SAP实施项目
  7. Cocos2d-x制作跳棋结束总结
  8. HbaseRowkey设计以及列族和列的关系
  9. js--《js延时加载有哪些方式》
  10. 【PyQt】自适应背景图片