algorithm ch6 heapsort
堆排序利用的是堆这种数据结构来对进行排序,(二叉)堆可以被视为一棵完全的二叉树,树的每个节点与数组中存放该节点的值得那个元素对应。这里使用最大堆进行排序算法设计,最大堆就是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);
} }
algorithm ch6 heapsort的更多相关文章
- algorithm ch6 priority queque
堆数据结构的一个重要用处就是:最为高效的优先级队列.优先级队列分为最大优先级队列和最小优先级队列,其中最大优先级队列的一个应用实在一台分时计算机上进行作业的调度.当用堆来实现优先级队列时,需要在队中的 ...
- POJ 2166 Heapsort(递推)
Description A well known algorithm called heapsort is a deterministic sorting algorithm taking O(n l ...
- Java HeapSort
Java HeapSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational & ...
- Java算法-堆排序
package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; public class HeapSor ...
- Java算法-希尔排序
希尔排序的诞生是由于插入排序在处理大规模数组的时候会遇到需要移动太多元素的问题.希尔排序的思想是将一个大的数组“分而治之”,划分为若干个小的数组,以 gap 来划分,比如数组 [1, 2, 3, 4, ...
- Java中各种排序算法
package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author treero ...
- 用Java实现几种常见的排序算法
用Java语言实现的各种排序,包括插入排序.冒泡排序.选择排序.Shell排序.快速排序.归并排序.堆排序.SortUtil等. 插入排序: package org.rut.util.algorith ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- heapsort
Introduction to Algorithms Third Edition The (binary) heap data structure is an array object that we ...
随机推荐
- 虚拟现实-VR-UE4-编译源代码后,无法运行
情况是这个样,在一开始我编译后,是可以运行,但是当我重新做系统后,再次运行时,每次都是到加载的18%的时候提示了如下错误 具体解决方法还没有找到,正在努力找中.........,会后续更新 同时希望有 ...
- 在阿里云上遇见更好的Oracle(一)
2003年毕业那年正好遇上非典,好不容易找到一份制造工厂的工作,凭着一点点的SQL基础进入了IT部门,在那里第一次听说了Oracle.在此之前,我对数据库的认知基本还停留在Access阶段,耳闻过一点 ...
- The Erdös-Straus Conjecture 题解
题面 Description The Brocard Erdös-Straus conjecture is that for any integern > 2 , there are posit ...
- Long Short-Term Memory (LSTM)
Long Short-Term Memory (LSTM) Outline Background LSTM Network Extended LSTM LST ...
- week12第二轮迭代任务分配forZ.XML
Z.XML第二轮迭代任务初步分配新鲜出炉,请关注! 以上便是任务分配列表,队员们会按照进度每天更改任务进度 当然,根据敏捷开发的方法,我们将在开发过程中根据情况迅速调整任务分配,以适应当时问题. Z- ...
- AtomicIntegerFieldUpdater使用
假设现在有这样的一个场景: 一百个线程同时对一个int对象进行修改,要求只能有一个线程可以修改. 看看下面程序是否正确: private static int a = 100; private sta ...
- Windows下的Memcache安装与Java部署
Windows下的Memcache安装: 1. 下载memcached的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 ‘c:\mem ...
- [剑指Offer] 7.斐波那契数列
class Solution { public: int Fibonacci(int n) { ] = {}; res[] = ; res[] = ; ;i < n;i ++){ res[i] ...
- hdu 1598 find the most comfortable road (并查集)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- P2730 魔板 Magic Squares
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...