数据结构之堆

原创 2018年04月17日 11:06:07

堆是一颗完全二叉树,所有父节点都满足小于等于其子节点的堆称为小根堆,所有父节点都满足大于等于其子节点的堆称为大根堆,堆虽然是一棵树,但是通常存放在一棵数组,父节点和子节点的关系通常通过元素下标来确定。
这里写图片描述
这里写图片描述
从图中,我们可以很容易的总结出,通过一个节点数组中的索引怎么计算出它的父节点及左右孩子节点。
public int left (int i){
return ((i+1)*2-1);
}
public int right (int i){
return ((i+1)*2);
}
public int parent (int i){
if(i==0)
return -1;
else
return (i-1)/2;
}
要构建一个堆,除了知道怎么计算一个节点的父节点和孩子节点的索引之外,还需要知道两个算法,保持堆的性质和建堆,建堆的方法对于大根堆和小根堆是一样的。
保持堆的性质,对与大根堆和小根堆很相似,但不完全一样,所以要分开说。
已经存在的两个大根堆,现在要把一个元素,作为这两个大根堆的根的父节点,构成一个新堆,但是这个堆的根节点可能不太符合大根堆的性质,可能他比他的孩子节点小,所以需要对它进行操作,操作的方式就是,我们从这个节点和他的孩子节点选出最大的,如果这个节点是最大的,堆就已经满足大根堆的性质了,否则将这个节点与最大节点交换,交换后该节点在新的位置上也可能违背大根堆的性质,所以需要递归的进行直至这个节点比孩子节点都大或者是子节点为止

package com.java.day11;

/**
 * Created by wangkaishuang on 18-4-17
 */
public class HeadDemo {
    static int left(int i){
        return ((i+1)*2-1);
    }
    static int right(int i){
        return ((i+1)*2);
    }
    static int parent(int i){
        if(i==0)
            return -1;
        else
            return (i-1)/2;
    }
    //大根堆
    static void maxHeapify(int[] a, int i, int heapLenth){
        int l = left(i);
        int r = right(i);
        int largest = -1;

        if(l<heapLenth && a[i]<(a[l])){
            largest = l;
        }
        else
            largest = i;
        if(r<heapLenth && a[largest]<a[r]){
            largest = r;
        }
        if(i != largest){
           int temp = a[i];
            a[i] = a[largest];
            a[largest] = temp;
            maxHeapify(a,largest,heapLenth);
        }
    }

    //小根堆
    void minHeapify(int[] a,int i,int heapLenth){
        int l = left(i);
        int r = right(i);
        int smallest = -1;

        if(l<heapLenth && a[i] > a[l]){
             smallest= l;
        }
        else
            smallest = i;
        if(r<heapLenth && a[smallest]>(a[r])){
            smallest = r;
        }
        if(i != smallest){
            int temp = a[i];
            a[i] = a[smallest];
            a[smallest] = temp;
            minHeapify(a,smallest,heapLenth);
        }
    }
    //建堆
    static void buildHeap(int[] a, int heapLenth){
        int lenthParent = parent(heapLenth-1);

        for(int i=lenthParent;i>=0;i--){
            maxHeapify(a,i,heapLenth);
        }
    }
    public static void main(String[] args){
        int a[] ={1,3,5,7,9};
        buildHeap(a,5);
        for(int c : a)
        System.out.println(c);
    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KSMaster/article/details/79971888

数据结构::堆及堆的应用~

【堆】: 1.概念:   堆是一种特殊的树形结构,堆的把每一个节点都有一个值,我们通常所说的堆这种数据结构,指的就是二叉堆。     其实它可以被看做一个完全二叉树。   它的每个节点的子树又可以被...
  • lalu58
  • lalu58
  • 2016-12-31 13:47:35
  • 1831

数据结构-堆(heap)

堆(heap)也被称为优先队列(priority queue)。队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。而堆也是一样,在堆底插入元素,在堆顶取出元素,但是堆中元素的排列...
  • juanqinyang
  • juanqinyang
  • 2016-05-15 20:00:44
  • 6758

数据结构之堆的定义

基本概念 堆是一种基本的数据结构。在这里我用数组来形容,在一个二叉堆的数组中,每一个元素都要保证大于等于另外两个特定位置的元素。同时相应的,这些元素又要大于等于另外两个相应位置的元素,整个数据结构以此...
  • qq_33186366
  • qq_33186366
  • 2016-07-11 01:30:38
  • 4337

数据结构之堆(Heap)的实现

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构,所以堆也叫做二叉堆。二叉堆满足二个特性:  1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。  2.每个结点的左子树和右子树...
  • leex_brave
  • leex_brave
  • 2016-05-24 15:28:10
  • 4184

【c++】数据结构———堆

堆是一种特殊的数据结构,它通常是一个可以被看做一棵树的数组对象。 What?那它到底是一棵树,还是一个数组呢?答案是数组。这个数组以二叉树的形式来维护。注意:这个二叉树必须是完全二叉树 堆结构的二...
  • LLZK_
  • LLZK_
  • 2016-10-20 09:57:41
  • 2496

数据结构系列——堆

堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,...
  • hqshaozhu
  • hqshaozhu
  • 2015-11-19 13:13:20
  • 1496

Java数据结构与算法:堆

堆的定义设有n个数据元素的关键字为(k0、k1、…、kn-1),如果它们满足以下的关系:ki= k2i+2)(i=0、1、…、(n-2)/2)则称之为堆(Heap)。如果将此数据元素序列用一维数组...
  • axi295309066
  • axi295309066
  • 2017-01-04 18:15:39
  • 369

堆(数据结构)及堆排序

1堆 这里的堆是指一种数据结构(或数据结构属性),非指堆内存。堆属性用二叉树来体现,具堆属性的数据结构才可被叫做为堆。具堆属性的数据结构满足以下笔记的“顺序”和“形状”两个条件。 (1)顺序 ...
  • misskissC
  • misskissC
  • 2013-12-21 02:08:58
  • 5903

堆这种数据结构 Java实现

关于我所遇见的各种堆的含义,可以在下面这两篇博文中看到: Java虚拟机 堆和栈 深入理解计算机系统 1.7 操作系统管理硬件 本文讲的是堆数据结构的实现,并给出Java代码。 堆是一颗完...
  • l294265421
  • l294265421
  • 2016-03-18 23:40:37
  • 5109

重学数据结构系列之——堆及堆排序

1.定义 满足一下两个条件 1.首先它是一颗完全二叉树(就是除了最后一层,每个结点都有两个孩子,最后一层只缺少右边的若干结点。)看看这个就明白:http://baike.baidu.com/pic...
  • u012763794
  • u012763794
  • 2016-03-29 21:33:14
  • 682
收藏助手
不良信息举报
您举报文章:数据结构之堆
举报原因:
原因补充:

(最多只允许输入30个字)