博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序算法---属于选择排序
阅读量:6642 次
发布时间:2019-06-25

本文共 1850 字,大约阅读时间需要 6 分钟。

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
#include
#include
#include
#include
#include
#include
const int INF=0X3f3f3f3f;using namespace std;typedef struct{ int a[100]; int len; void outList(){ for(int i=1; i<=len; ++i) cout<
<<" "; cout<
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[L.len-i+1];//将最后一个元素赋给第一个元素 heapAdjust(1, L.len-i);//重新调整堆 } cout<
本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/4676852.html,如需转载请自行联系原作者
你可能感兴趣的文章
批处理删除任意天之前的文件
查看>>
421 Home directory not available - aborting错误的解决方法
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
js的发布/订阅模式
查看>>
Introduction To Neural Networks
查看>>
事件处理
查看>>
Android 中的 Service 全面总结(三)
查看>>
怎样利用strace调试
查看>>
AES
查看>>
shell脚本抓取用户存储quota写道mysql并展现到grafana面板
查看>>
关于docker的我自己的理解
查看>>
MySQL事务
查看>>
“网络安全”的含义
查看>>
How to write a good tech blog
查看>>
我的友情链接
查看>>
全球 ICT 50 强榜单:阿里、中兴上榜
查看>>
Windows系统运维转linux系统运维的经历
查看>>
iPhone之我见
查看>>
ASP.NET MVC 5 - 给数据模型添加校验器
查看>>