正宗黄岩本地早黄岩蜜橘10斤非涌泉蜜桔浙江台州橘子新鲜水果桔子

堆排序的具体算法

堆排序的具体算法


1、 堆排序定义
n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质):
(1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤  )
若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
【例】关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质(1)和(2),故它们均是堆,其对应的完全二叉树分别如小根堆示例和大根堆示例所示。
2、大根堆和小根堆
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。
注意:
①堆中任一子树亦是堆。
②以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。
3、堆排序特点
堆排序(HeapSort)是一树形选择排序。
堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系【参见二叉树的顺序存储结构】,在当前无序区中选择关键字最大(或最小)的记录。
4、堆排序与直接插入排序的区别
直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。
堆排序可通过树形结构保存部分比较结果,可减少比较次数。
5、堆排序
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(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个关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻,堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。
(3)堆排序的算法:
void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元
int i;
BuildHeap(R); //将R[1-n]建成初始堆
for(i=n;i>1;i--){ //对当前无序区R[1..i]进行堆排序,共做n-1趟。
R[0]=R[1];R[1]=R[i];R[i]=R[0]; //将堆顶和堆中最后一个记录交换
Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质
} //endfor
} //HeapSort
(4) BuildHeap和Heapify函数的实现
因为构造初始堆必须使用到调整堆的操作,先讨论Heapify的实现。
① Heapify函数思想方法
每趟排序开始前R[l..i]是以R[1]为根的堆,在R[1]与R[i]交换后,新的无序区R[1..i-1]中只有R[1]的值发生了变化,故除R[1]可能违反堆性质外,其余任何结点为根的子树均是堆。因此,当被调整区间是R[low..high]时,只须调整以R[low]为根的树即可。
"筛选法"调整堆
R[low]的左、右子树(若存在)均已是堆,这两棵子树的根R[2low]和R[2low+1]分别是各自子树中关键字最大的结点。若R[low].key不小于这两个孩子结点的关键字,则R[low]未违反堆性质,以R[low]为根的树已是堆,无须调整;否则必须将R[low]和它的两个孩子结点中关键字较大者进行交换,即R[low]与R[large](R[large].key=max(R[2low].key,R[2low+1].key))交换。交换后又可能使结点R[large]违反堆性质,同样由于该结点的两棵子树(若存在)仍然是堆,故可重复上述的调整过程,对以R[large]为根的树进行调整。此过程直至当前被调整的结点已满足堆性质,或者该结点已是叶子为止。上述过程就象过筛子一样,把较小的关键字逐层筛下去,而将较大的关键字逐层选上来。因此,有人将此方法称为"筛选法"。
具体的算法【参见教材】
②BuildHeap的实现
要将初始文件R[l..n]调整为一个大根堆,就必须将它所对应的完全二叉树中以每一结点为根的子树都调整为堆。
显然只有一个结点的树是堆,而在完全二叉树中,所有序号 的结点都是叶子,因此以这些结点为根的子树均已是堆。这样,我们只需依次将以序号为 ,  -1,…,1的结点作为根的子树都调整为堆即可。
具体算法【参见教材】。
5、大根堆排序实例
对于关键字序列(42,13,24,91,23,16,05,88),在建堆过程中完全二叉树及其存储结构的变化情况参见【动画演示】。
6、 算法分析
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
它是不稳定的排序方法。


VC++中怎么向串口发送8位数据?
VC++中怎么向串口发送8位数据?
asp.net怎么学?
怎样管理一个网站?应注意些些问题?
如何把sql表头导出为excel表
c语言最基础的问题
VB编写计算器中的那个小数点怎么实现?
为什么?为什么?为什么?为什么?
上海有多少JAVA程序员
请教如何有用PHP下载需输入登陆信息的网页的内容?谢谢!
上海JAVA程序员的工资大概在多少?
C问题!!
java编的CLASS文件无法打开
C#.net工资有多少
数据库的学习有什么好的资料和案例?
网页:如何让连接打开为新开窗口?
php程序员工资多少
怎样在网站首页调用PHPWIND帖子的内容?
struts 中<html:hidden>的问题
在EXCEL数据库中如何实现输入一个属性比如:姓名是汪洋,便可以得到关于这个人的所有信息
asp问题:recordset对象的游标问题
最新的程序开发工具是什么?
请问windowsACCESS 效果怎么样?我只想建立一个简单的数据库,要求不高
关于C语言
请问,什么结构的数据库好,树形的如何?我要建立一个文件查询数据库
求个人发展经验:毕业,工作,创业,爱情,如何少走弯路
堆排序的具体算法
下列数据或公式的值被Excel视为字符型数据的是()。
VC++6.0的MSDN和.net的MSDN一样吗?
在Excel中关于函数COUNT()与函数COUNTA()的叙述中正确的是()。
在哪可以找到excel vba 视频教程
哪里有PowerDesign11中文版下载
VB中如何删除选中的listbox中的项目
asp问题:数据库
有那个大侠会做搜索引擎网,我有偿学习帮我制作
你学过ASP.NET吗?
ADO连接数据库登陆失败原因
关于一个批处理文件的问题
为什么人能开发出这么多东西呢
求答:C#简单问题
看看这里面是什么
汉化软件过程中,该如何解决双字节问题?
debugger图书
在没有数据库支持的前提下网页是否可以实现简单的动态更新?
Delphi编程时候窗口弹出问题。
C++和VC++有很大区别吗
C、C++,Foxpro、Foxbase,都是什么关系?学哪个好?
谁有仿黑客帝国的数字流版JS在代码。
C#中关于访问级别的简单问题
Movie Maker怎么用?
请问哪里有wmv编辑方面的编程资料
二叉树的非递归遍历?要有讲解 不要纯程序~!!
我这个单链表类怎么在主程序中初始花对象
尴尬的五笔代码
QQ是用什么语言编写的?
coldfusion怎么产生介于两个数之间的随机数(比如1到100之间)
请教c语言编程问题.先谢过了~~~
网页编程!急!!!
用那种数据库比较好,能到入现成的EXCEL表,汇总需做些字段的调整
ASP文本框提交后数据的获取
如何学习C++
请教学编程的方法?
有谁知道如何下载swf文件
vb中如何跳过错误
有那位程序高手帮帮忙
在什么网上能找到编程的汉化补丁
vb的Initialize事件到底是什么意思?是在LOAD之前发生的?不明白
汇编语言的编程环境是什么
怎么使用MFC
谁能告诉我linux下出core,core究竟是什么?
怎样才能在制作FLASH游戏时实现存档功能
很简单但我不会的关于C++的问题
怎样建立传奇私服~~~
asp中为什么不能修改数据库
php如何引用flash中的变量?
如何让服务器同时支持utf-8 与 gb2312
用C语言for语句编出一条程序
c++在中国有哪些开发方向?
C#简单问题
XP下如何支持VB.net编写的程序
delphi 文本框问题
asp有那些标记符号?
delphi语言应用在哪些方面?发展前途如何?怎样把它学好 ?
请教汇编语言ASCII
Cocoon是什么语言?
运行程序时出现“一闪而过”是什么原因?
哪里有汇编语言的详细视频教程
谁会photo shoP
个位高手请问一下关于vb的问题?
如何在SQL SERVER 2000 里打开一个数据库???
dll如何自动挂到其它程序
关于C语言的手提式类型转换
vc与tc的问题?
什么程序能处理图片
C++程序语言有哪些比较容易懂的入门教程啊?
C语言编程
如果用ASP实现在ACCESS数据库中添加新表
free pascal和turbo pascal的区别
用C语言for语句设计一个小游戏
如何将DATALISST 与ADO绑定?

100
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 92661 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110