堆排序算法---属于选择排序
1.堆
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。
2.堆排序的思想
利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。
其基本思想为(大顶堆):
1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区;
2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];
3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到 新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
3.操作过程如下:
1)初始化堆:将R[1..n]构造为堆;
2)将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。
因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调整。
4.举例说明堆排序的操作过程
a首先是讲一个无序的序列构建成一个个堆:
b.然后是输出堆顶元素之后,调整剩余元素成为一个新的堆:
5.下面是代码部分:
#include<iostream> #include<cstring> #include<string> #include<queue> #include<map> #include<cstdlib> #include<cstdio> const int INF=0X3f3f3f3f; using namespace std;typedef struct {int a[100];int len;void outList(){for(int i=1; i<=len; ++i)cout<<a[i]<<" ";cout<<endl;} }list; list L; /**********************************************************************************/void heapAdjust(int ld, int rd){//堆排序, 排序区间[ld,rd] int rc = L.a[ld];int cur = ld;for(int p = ld*2; p<=rd; p=p*2){if(p<rd && L.a[p] > L.a[p+1]) ++p;//取左右子树的最小值if(rc < L.a[p]) break;//如果父节点的值比左右子树的值都小,那么已经调整好了,已经是小堆顶了L.a[cur] = L.a[p];//否则交换父节点和左右子树最小的子树的值,父节点的值存在rc中,所以只要将最小子树的值赋给父节点就好 cur = p;}L.a[cur] = rc; }/**********************************************************************************/int main() {int i;scanf("%d", &L.len);for(i=1; i<=L.len; i++)scanf("%d", &L.a[i]);for(int i=L.len/2; i>=1; --i)//将整个区间调整成小堆顶,从最后一个非终结点开始 heapAdjust(i, L.len);for(int i=1; i<=L.len; ++i) {cout<<L.a[1]<<" "; L.a[1] = L.a[L.len-i+1];//将最后一个元素赋给第一个元素 heapAdjust(1, L.len-i);//重新调整堆 }cout<<endl;return 0; }
转载于:https://www.cnblogs.com/hujunzheng/p/4676852.html
堆排序算法---属于选择排序相关推荐
- 堆排序算法c语言筛选法,【排序】排序算法之选择排序
排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...
- php+堆排序算法,PHP实现排序堆排序(Heap Sort)算法
算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据 ...
- 数据结构与算法:选择排序
数据结构与算法:选择排序 雪柯 大工生物信息 提笔为写给奋进之人 已关注 8 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国忠 特别备注:本书非原创,但部分内容自己 ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试
案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...
- 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析
排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...
- 数据结构与算法之选择排序
数据结构与算法之选择排序 目录 基本介绍 选择排序思想 代码实现 1. 基本介绍 选择排序也属于内部排序法,是从排序的数据中,按指定的规则选出某一元素,再依次交换位置后达到排序的目的 2. 选择排序思 ...
- C++算法之选择排序
C++算法之选择排序 文章目录 C++算法之选择排序 一.选择排序 二.题目 1.明明的随机数 2.代码 三.复杂度分析 一.选择排序 选择排序(Selection Sort)是我们学习的第一个排序算 ...
- 数据结构七大排序算法图解——选择排序动图演示
系列文章目录 四.选择排序 紧接上一篇交换排序 前言: 1.直接选择排序 思想: 例题: 代码部分: 性能分析 2.树形选择排序 思想: 例题一: 例题二: 性能分析 3.堆排序 定义: 方法: 如何 ...
最新文章
- pyqt5实战之使用画布显示缩略图
- ADAS辅助驾驶_自动驾驶_技术点列表
- 【FI模块学习笔记】 实收资本概述
- Mellanox 8亿美元收购EZchip
- java---连接池的学习
- LeetCode 1781. 所有子字符串美丽值之和
- Java try catch finally语句
- leetcode 《简单》 数学部分 Python实现
- zend studio设置自动保存
- struts(二)——struts框架实现的基本原理
- 手机1像素线粗_移动端1像素边框问题
- 基于cesium和mars3d海洋三维管线信息系统开发完工总结
- Processing交互应用——躲避炸弹
- 桌面虚拟化传输协议之android spice及spice源码分析之server(1)
- 动点四边形周长最短_中考数学之四边形周长最小值
- H3C 物联网路由器4G配置
- window server 2012 更改密钥 更改系统序列号
- 稳住!特斯拉电动皮卡
- ZEMAX 如何通过 K-相关分布模拟表面散射
- 河南某商务楼BA系统设计
热门文章
- 快速开发工作流_02_集成在线流程设计器
- Vue封装预约日期插件和发布到npm上
- 个人帐目管理系统java_Java 项目 个人帐目管理系统
- cstring 不明确_股价不可预测明确时间点的涨跌
- igmp是哪个层协议_通俗易懂网络协议(IP)
- jq之$(“ul li:first“)
- BugkuCTF-MISC题隐写2
- java整属取余数_js取整数、取余数的方法
- 合并两个有序数组 java_合并两个有序的数组
- js 条码枪扫描_年会展台 精彩不断 | 沧田:从打印到扫描录入 国产品牌从未停止...