首页

文章

堆排序是什么

发布网友 发布时间:2022-04-19 19:13

我来回答

5个回答

热心网友 时间:2022-04-26 02:35

【概念】堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]]
>=
A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
【起源】
1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert
W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法(
Heap
Sort
)。
【简介】
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(1)用大根堆排序的基本思想

先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区

再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个元素为止。
(2)大根堆排序算法的基本操作:
①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2)
其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。
②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中也会用到。利用的思想是比较节点i和它的孩子节点left(i),right(i),选出三者最大(或者最小)者,如果最大(小)值不是节点i而是它的一个孩子节点,那边交互节点i和该节点,然后再调用调整堆过程,这是一个递归的过程。调整堆的过程时间复杂度与堆的深度有关系,是lgn的操作,因为是沿着深度方向进行调整的。
③堆排序:堆排序是利用上面的两个过程来进行的。首先是根据元素构建堆。然后将堆的根节点取出(一般是与最后一个节点进行交换),将前面len-1个节点继续进行堆调整的过程,然后再将根节点取出,这样一直到所有节点都取出。堆排序过程的时间复杂度是O(nlgn)。因为建堆的时间复杂度是O(n)(调用一次);调整堆的时间复杂度是lgn,调用了n-1次,所以堆排序的时间复杂度是O(nlgn)[2]
注意:
①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止
【特点】
堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录
【算法分析】
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
平均性能:O(N*logN)。
其他性能:由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。堆排序是就地排序,辅助空间为O(1)。它是不稳定的排序方法。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前
和排序后他们的相对位置不发生变化)。

热心网友 时间:2022-04-26 03:53

堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录
其过程为:
(1)用大根堆排序的基本思想

① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区


再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key

③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。

……

直到无序区只有一个元素为止。

(2)大根堆排序算法的基本操作:

① 初始化操作:将R[1..n]构造为初始堆;


每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。

注意:

①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。

②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止

热心网友 时间:2022-04-26 05:27

堆排序就是利用堆的数据结构进行排序,通过调整堆的结构使得关键字有一定的顺序。有最大堆和最小堆,堆排序在类似topK问题中经常应用,效率比其他内部排序算法高。

热心网友 时间:2022-04-26 07:19

堆排序
1、
堆的定义
堆是一个含有n个关键字{k1,k2,…,kn}的序列,且具有如下特性:
ki<=k2i

ki<=k2i+1
(1<=i<=n/2)
(1)

ki>=k2i

ki>=k2i+1
(1<=i<=n/2)
(2)
ki>=k2i
满足式(1)的称为极小化堆,或极小堆,或小堆,满足式(2)的称为极大化堆,或极大堆,或大堆。本节以极小化堆为例子进行讲解。
堆与完全二叉树的关系:堆是n个元素(关键字)的序列,满足完全二叉树顺序存储中结点间的关系(双亲与子女序号间的关系)。
17,28,51,33,62,96,87,51
是小顶堆
96,51,87,33,28,62,51,17
是大顶堆
二叉堆
2、
堆排序的基本问题
既然堆顶元素(关键字)是最小元素,所以它是排序序列的最小元素,输出后,将其它元素再调整成堆,新的堆顶元素是排序序列的第二个元素。如此下去,通过堆,可将一个无序序列变为一个有序序列。因此,堆排序的基本问题是:
(1)
如何建堆
(2)
如何调堆
3、
如何调堆
将最后一个元素和堆顶元素交换(相当将堆顶元素输出)后,这时,从堆顶到倒数第二元素,除堆顶元素外,其余元素均符合堆的定义。下面采用筛选法,把包括堆顶元素在内的所有元素调成堆。大堆根
void
Sift(RecType
R[],int
i,int
m)
{
‖假设R[i+1..m]中各元素满足堆的定义,本算法调整R[i]使序列
‖R[i..m]中各元素满足堆的性质
R[0]=R[i];
‖暂存“根”记录R[i]
for(j=2*i;
j<=m;
j*=2)
‖j<=m时,R[2i]是R[i]的左孩子
{
if(j<m
&&
R[j].key<R[j+l].key)
j++;
‖若R[i]的右孩子存在,且关键字大于左孩子,j指向R[i]的右孩子
if(R[0].key<R[j].key)
‖孩子结点关键字较大
{
R[i]=R[j];
‖将R[j]换到双亲位置上
i=j;
‖修改当前被调整结点
}
else
break;
‖调整完毕,退出循环
}‖for
R[i]=R[0];
‖最初被调整结点放入正确位置
}‖Sift
4、
如何建堆
具有n个结点的完全二叉树,其叶子结点被认为符合堆的定义,其最后一个非终端结点的编号是n/2,若从该结点开始,直到根结点,依次调用上面的筛选法,则可完成堆的建立。具体算法放在下面堆排序算法中。
5、
堆排序算法
void
HeapSort(RecType
R[],int
n)
{
‖对记录序列R[1..n]进行堆排序。
for(i=n/2;i>0;i--)
‖把R[1..n]建成大顶堆
Sift(R,i,n);
for(i=n;i>1;i--)
{
‖将堆顶记录和当前未经排序子序列R[1..i]中最后一个记录相互交换
R[1]←→R[i];
Sift(R,1,i-1);
‖将R[1..i-1]重新调整为大顶堆
}‖for
}‖HeapSort
6、
堆排序算法分析
时间复杂度为O(nlogn),只需要一个记录大小供交换用的辅助存储空间。

热心网友 时间:2022-04-26 09:27

堆排序
1、 堆的定义
堆是一个含有n个关键字{k1,k2,…,kn}的序列,且具有如下特性:
ki<=k2i
且 ki<=k2i+1 (1<=i<=n/2) (1)

ki>=k2i
且 ki>=k2i+1 (1<=i<=n/2) (2)
ki>=k2i
满足式(1)的称为极小化堆,或极小堆,或小堆,满足式(2)的称为极大化堆,或极大堆,或大堆。本节以极小化堆为例子进行讲解。
堆与完全二叉树的关系:堆是n个元素(关键字)的序列,满足完全二叉树顺序存储中结点间的关系(双亲与子女序号间的关系)。
17,28,51,33,62,96,87,51 是小顶堆
96,51,87,33,28,62,51,17 是大顶堆

二叉堆
2、 堆排序的基本问题
既然堆顶元素(关键字)是最小元素,所以它是排序序列的最小元素,输出后,将其它元素再调整成堆,新的堆顶元素是排序序列的第二个元素。如此下去,通过堆,可将一个无序序列变为一个有序序列。因此,堆排序的基本问题是:
(1) 如何建堆
(2) 如何调堆
3、 如何调堆
将最后一个元素和堆顶元素交换(相当将堆顶元素输出)后,这时,从堆顶到倒数第二元素,除堆顶元素外,其余元素均符合堆的定义。下面采用筛选法,把包括堆顶元素在内的所有元素调成堆。大堆根
void Sift(RecType R[],int i,int m)
{ ‖假设R[i+1..m]中各元素满足堆的定义,本算法调整R[i]使序列
‖R[i..m]中各元素满足堆的性质
R[0]=R[i]; ‖暂存“根”记录R[i]
for(j=2*i; j<=m; j*=2) ‖j<=m时,R[2i]是R[i]的左孩子
{ if(j<m && R[j].key<R[j+l].key) j++;
‖若R[i]的右孩子存在,且关键字大于左孩子,j指向R[i]的右孩子
if(R[0].key<R[j].key) ‖孩子结点关键字较大
{ R[i]=R[j]; ‖将R[j]换到双亲位置上
i=j; ‖修改当前被调整结点
}
else break; ‖调整完毕,退出循环
}‖for
R[i]=R[0]; ‖最初被调整结点放入正确位置
}‖Sift

4、 如何建堆
具有n个结点的完全二叉树,其叶子结点被认为符合堆的定义,其最后一个非终端结点的编号是n/2,若从该结点开始,直到根结点,依次调用上面的筛选法,则可完成堆的建立。具体算法放在下面堆排序算法中。
5、 堆排序算法
void HeapSort(RecType R[],int n)
{ ‖对记录序列R[1..n]进行堆排序。
for(i=n/2;i>0;i--) ‖把R[1..n]建成大顶堆
Sift(R,i,n);
for(i=n;i>1;i--)
{ ‖将堆顶记录和当前未经排序子序列R[1..i]中最后一个记录相互交换
R[1]←→R[i];
Sift(R,1,i-1); ‖将R[1..i-1]重新调整为大顶堆
}‖for
}‖HeapSort
6、 堆排序算法分析
时间复杂度为O(nlogn),只需要一个记录大小供交换用的辅助存储空间。

参考资料:http://zhidao.baidu.com/question/202404050.html

年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 数据结构堆排序 什么叫 筛选法建堆 筛选法建立初始堆图解 【合集】日本高清视频线播放,【免费高清】在线观... 【合集】日本视频在线免费看,【在线观看】免费百... 【合集】日本高清视频在线看看,【在线观看】免费... 跪求日本免费高清视频在线播放,【在线观看】免费... 【合集】日本视频在线观看免费,【免费高清】在线... 房贷需要交保险费吗 怎么知道对方的被封几次 为什么,有房贷还必须要买保险 申请银行贷款银行能强制买保险吗 光大银行申请房贷买保险最低限度是多少? 我和广发银行贷款买房,我已有百万保额的意外险,银... 银行要购房者买保险是什么回事 我去年办理房贷,被银行人员忽悠买了富德人生的保... 银行申请贷款需要购买保险, 贷款买房必须买保险?小心被忽悠 办理房贷一定要买保险吗? 办理房贷前银行要求我购买保险,为了放款顺利,我... 有一组数据(15,9,7,8,20,-1,7,4),用堆排... 请教个堆排序的问题,谢谢了! 急! 内部堆排序算法的实现!!!包括大根堆的实现... 这样一组数 45 28 49 16 37 82 56 75初始堆后,利... 用一组{14,15,30,28,5,10}关键字序列,写出... 利用堆排序建立的初始大根堆 堆排序过程 计算机三级数据库堆排序的选择题 堆排序的堆是怎么建立的? 关于堆排序的问题 pascal的问题 怎么让Heap sort 变为稳定排序? 怎么把小米智能摄像头连接电脑用来做视频通话时的... 小米手机摄像头在电脑上怎么用? 小米摄像头能用电脑打开看吗 小米智能摄像机云台版能当电脑摄像头用吗? 小米摄像头咋样于电脑连接设置 小米手机的摄像头可以用在电脑上吗 米家小白智能摄像机小米摄像头能当电脑摄像头吗 如何在电脑端 查看小米摄像机
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com