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

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

堆排序是基于二叉树。n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):

(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于的非,K(2i)则是左子节点,k(2i+1)是右子节点。

堆排序的几个关键点:

1、一个节点的两个子节点已经是有序堆,调整这个节点为有序堆(递归调整);

2、创建堆:调整第一个非叶节点为有序堆,逐级向上,直到整个数组为有序堆。

3、堆顶与最后一个叶子节点调换,堆变小,再调整堆,再调换,直到堆大小为1,排序完成。

附上代码:

#include "stdafx.h"#include 
/* * L 初始无序堆 * n 节点序号 * size 无序堆节点个数 */void Heapify(int L[], int n, int size){ int rchild=2*n+1; int lchild=2*n; if (rchild<=size) { int max=L[lchild]>L[rchild] ? lchild : rchild; if (L[n]
0; i--) // 从最低层的节点开始创建有序堆,直到整个堆是有序堆。 { Heapify(L,i,size); }}// L[0]是暂存区void HeapSort(int L[], int size){ BuildHeap(L,size); for (int i=size; i>0; i--) { L[0]=L[1]; L[1]=L[i]; L[i]=L[0]; Heapify(L,1,i-1); }}int main(int argc, char* argv[]){ // 待排序数据不包括L[0] int L[13]={
5,1,7,2,90,6,-5,23,10,4,50,12,5}; int i=0; for (i=1; i<13; i++) { printf("%5d",L[i]); } printf("\n"); HeapSort(L,12); for (i=1; i<13; i++) { printf("%5d",L[i]); } printf("\n"); return 0;}

 

转载于:https://www.cnblogs.com/icooper/p/4580942.html

你可能感兴趣的文章
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&amp;语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
属性动画
查看>>
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
通过httplib2 探索的学习的最佳方式
查看>>