堆排序利用的是堆这种数据结构来对进行排序,(二叉)堆可以被视为一棵完全的二叉树,树的每个节点与数组中存放该节点的值得那个元素对应。这里使用最大堆进行排序算法设计,最大堆就是parent(i) > leftchild(i) 且parent(i) > rightchild(i),首先利用迭代法进行建堆。

int left(int index)
{
return index*+;
}
int right(int index)
{
return index*+;
}

下面是建堆的函数:

void MaxHeapify(int *a, int node, int iHeapSize)
{
int iIndexL = left(node);
int iIndexR = right(node);
int iLargest = node;
if(iIndexL < iHeapSize && a[iIndexL] > a[node])
{
iLargest = iIndexL;
}
else
iLargest = node;
if(iIndexR < iHeapSize && a[iIndexR] > a[iLargest])
{
iLargest = iIndexR;
}
if(iLargest != node)
{
swap(a[iLargest], a[node]);
MaxHeapify(a, iLargest, iHeapSize);
} }
void BuildHeap(int *a, int &iHeapSize)
{
int iSize = iHeapSize;
for(int iLoop = iSize/-; iLoop != ; --iLoop)
{
MaxHeapify(a, iLoop, iHeapSize);
}
}

以上代码可以建立一个最大堆,在子数组中A[n/2+1 .. n]中的元素都是树的叶子节点,可以看作是只含一个元素的堆,因此只需用BuilHeap对树中的其他节点调用MaxHeapify
来建立最大堆。

接着就是排序,因为最大元素在A[1](为了避免节点计算麻烦,序号从1开始),可以通过将它与A[n]交换。调用MaxHeapify(a, 1, iHeapSize)来保持最大堆性质,然后重复这个过程,堆的大小由n-1一直降到1.排序部分如下:

void HeapSort(int *a, int heapSize)
{
if(a == NULL)
{
return;
} BuildHeap(a, heapSize);
for(int i=heapSize-; i>=; i--)
{
swap(a, a+i);
--heapSize;
MaxHeapify(a, , heapSize);
} }

最新文章

  1. Java批处理ExecutorService/CompletionService
  2. Spring系列之依赖注入的方式
  3. 首届Autodesk编程马拉松(Hackathon)开始报名啦 -- 6.14~15 上海
  4. sqlmap
  5. Android 读取txt文件并以utf-8格式转换成字符串
  6. 关于static静态
  7. twitter 授权过程
  8. 用PopWindow做下拉框
  9. Xamarin控件使用之GridView
  10. PHP初入,基础知识点分享(a标签&amp;表格的嵌套&amp;文字的处理)
  11. php树形结构数组转化
  12. 从2PC到Paxos
  13. Fetch请求后台的数据
  14. P1705 爱与愁过火(背包)
  15. 【转】常用html转义符,JavaScript转义符
  16. 命令运行带参数的jar
  17. SpringCloud初体验:一、Eureka 服务的注册与发现
  18. RocketMQ详解
  19. 《JavaScript 实战》:JavaScript 实现图片切割效果
  20. [LabVIEW架构]ActorFramework(二)

热门文章

  1. 第二篇 Fiddler配置_浏览器&amp;手机
  2. [leetcode-651-4 Keys Keyboard]
  3. HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)
  4. winform构造函数和load事件
  5. java课程设计 学生管理系统
  6. xml解析标签
  7. ArcGIS Engine开发中利用GP工具时常出现的错误
  8. thinkphp3.2 验证码的使用
  9. 处理大并发量订单处理的 KafKa部署总结
  10. BZOJ4321 queue2(动态规划)