堆排序虽然叫heap sort,但是和内存上的那个heap并没有实际关系。算法上,堆排序一般使用数组的形式来实现,即binary heap。

我们可以将堆排序所使用的堆int[] heap视为一个完全二叉树,即,除非最后一层右侧有空结点,其他都为满结点。

对于任意heap[i]有如下一些性质:

1. i从1开始。

2. heap[i]的父节点为heap[i / 2]。

3. heap[i]的左子节点为heap[i * 2],右子节点为heap[i * 2 + 1]。

我们假设这个堆是一个最大堆,也就是父节点大于所有子节点,而且每个子树也有这样的性质。下面几个和堆排序有关的方法,基本来自于《算法导论》中的思路。

maxifyHeap方法,堆中index这个位置的结点破坏了整个堆的性质,但是其他结点的位置就是对的。我们首先将heap[index]和它左右子节点中,较大的那个交换位置,比如是left,然后递归调用maxifyHeap(left)。为什么假设只有index这个结点位置不对?因为这个方法一般是在建堆之后调用,也就是基于heap已经是最大堆的事实。这个方法的时间复杂度为O(logn)。

buildMaxHeap方法,建堆。也就是在堆在初始状态,很乱的时候,首次调用。思路是:从树的倒数第二层的最后一个有子节点的结点开始,递归调用上面的maxifyHeap方法。注意,开始的结点必然是heapLength,终点是1。时间复杂度为O(n)。

heapSort方法,首先用buildMaxHeap建堆,然后将堆顶元素和最后一个元素交换位置,这时候最后一个元素肯定到位了,最大。但是第一个元素交换过来的肯定不该在第一位,注意,这时其他结点仍然没有破坏最大堆的性质。所以我们只要调用maxifyHeap(1)就可以了。所以我们,循环这样做,每次将堆顶元素和最后一个元素交换位置,同时heapLength--。直到heapLength==1。时间复杂度为O(nlogn)。

public class BinaryHeap {
static int heapLength; public static void maxifyHeap(int[] heap, int index) {
if(index > heapLength) {
return;
}
int left = index * 2, right = index * 2 + 1;
int larger = -1;
if(left <= heapLength) {
if(heap[left] > heap[index]) {
larger = left;
}
}
if(right <= heapLength) {
if(heap[right] > heap[index] && heap[right] > heap[left]) {
larger = right;
}
}
swap(heap, index, larger);
maxifyHeap(heap, larger);
} public static void buildMaxHeap(int[] heap) {
for(int i = heapLength / 2; i >= 1; i--) {
maxifyHeap(heap, i);
}
} public void heapSort(int[] heap) {
buildMaxHeap(heap);
for(int i = heapLength; i >= 1; i--) {
swap(heap, 1, i);
heapLength--;
maxifyHeap(heap, 1);
}
} public static void swap(int[] heap, int index1, int index2) {
int temp = heap[index1];
heap[index1] = heap[index2];
heap[index2] = temp;
}
}

参考http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html

堆排序 Heap Sort的更多相关文章

  1. 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)

    堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...

  2. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...

  3. 算法----堆排序(heap sort)

    堆排序是利用堆进行排序的高效算法,其能实现O(NlogN)的排序时间复杂度,详细算法分析能够点击堆排序算法时间复杂度分析. 算法实现: 调整堆: void sort::sink(int* a, con ...

  4. 堆排序Heap sort

    堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的 ...

  5. Java实现---堆排序 Heap Sort

    堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关 ...

  6. 小小c#算法题 - 7 - 堆排序 (Heap Sort)

    在讨论堆排序之前,我们先来讨论一下另外一种排序算法——插入排序.插入排序的逻辑相当简单,先遍历一遍数组找到最小值,然后将这个最小值跟第一个元素交换.然后遍历第一个元素之后的n-1个元素,得到这n-1个 ...

  7. 数据结构与算法---堆排序(Heap sort)

    堆排序基本介绍 1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序. 2.堆是具有以下性质的完全二叉树:每个 ...

  8. [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)

    [Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...

  9. 堆排序(Heap Sort)的C语言实现

    堆排序(Heap Sort)具体步骤为 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆 将顶部元素与堆尾数组交换,此是末尾元素就是最大值, ...

随机推荐

  1. DrawerLayout带有侧滑功能的布局类(1)

    DrawerLayout: DrawerLayout顾名思义就是一个管理布局的.使用方式可以与其它的布局类类似. DrawerLayout带有滑动的功能.只要按照drawerLayout的规定布局方式 ...

  2. hdu 1575 Tr A

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1575 Tr A Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和), ...

  3. 将商户后台_门店管理后台_平台后台管理v1.0 Axure RP项目上传到svn服务器步骤

  4. .net 使用validator做数据校验

    概述 在把用户输入的数据存储到数据库之前一般都要对数据做服务端校验,于是想到了.net自带的数据校验框架validator.本文对validator的使用方法进行介绍,并分析下校验的的原理. 使用va ...

  5. Qt5 程序发布打包

    关于qt5在win7下发布 & 打包 ----------------------------------------------------------------------------- ...

  6. asp.net自带的异步刷新控件使用

    一直都是使用jquery的$.ajax,由于刚刚加入的公司是用asp.net的,webform与之前的ajax加在一起显得很混乱,后来发现asp.net已经封装了一下ajax功能,就查了一下,并且做了 ...

  7. pietty and putty safe password

    如何让putty记住密码..pietty也一样的不能记住密码. 找不到好的的方法...只好试着按照参数格式做了一个快捷方式..F:\soft\pietty.exe -pw password123 ro ...

  8. ZBar之自定义二维码扫描

    // // YvanQRCodeViewController.m // zBar // // Created by City--Online on 15/6/8. // Copyright (c) 2 ...

  9. hibernate---CRUD

    delete @Test public void testDelete() { Teacher t = new Teacher(); t.setName("t1"); t.setT ...

  10. 【CentOS】安装配置vncserver

    参考资料: http://my.oschina.net/yankunren/blog/70042 安装过程 (1).检查vncserver是否已经安装 [root@Nginx canyouNgx]# ...