关闭

大顶堆和小顶堆--Java版

1385人阅读 评论(0) 收藏 举报
分类:

目录:

1、前期参考

2、大顶堆原理

3、小顶堆原理

4、大顶堆和小顶堆对比图

5、大顶堆代码

6、执行结果

————————————————————————————-

1、前期参考

使用一维数组存储二叉树
http://blog.csdn.net/silentwolfyh/article/details/76946539
Java链表来存储二叉树和(前中后序)遍历二叉树
http://blog.csdn.net/silentwolfyh/article/details/72901541

2、大顶堆原理

       大顶堆原理:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大顶堆。大根堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值。

3、小顶堆原理

       小顶堆原理:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者,称为小顶堆。小根堆要求根节点的关键字既小于或等于左子树的关键字值,又小于或等于右子树的关键字值。

4、大顶堆和小顶堆对比图

这里写图片描述

5、大顶堆代码

package com.datastructure;

/***
 *   需求:Java实现大顶堆和小顶堆
 *   
 *   备注:
 *   1、左节点的坐标等于父节点的坐标*2,右节点的坐标等于父节点的坐标*2+1
 *   2、变量j是2的倍数,也就是说j是左子节点 
 *   3、【如果小顶堆,则在看while中小顶堆的比较】
 * 
 *   代码步骤:
 *   1、整体执行过程:从最大根节点的坐标递减
 *   2、while中的if(j<size)语句,会判断二叉树的节点是偶数还是基数
 *   3、如果是偶数则只有左节点,无法比较,只能和父节点比较
 *   4、如果是基数则对比两个子节点获取最大值,再与父节点比较
 *   5、父节点大于子节点则退出
 *   6、父节点小于子节点则继续while循环比较
 */
import java.io.*;
public  class MaxHeap
{
public static void main(String args[]) throws IOException
   {

    int i,size,data[]={0,5,6,10,8,3,2,19,9,11}; //原始数组内容

    size=data.length;

    System.out.print("原始数组:");

    for(i=1;i<size;i++)
        System.out.print("["+data[i]+"] ");

    System.out.println("");

    MaxHeap.heap(data,size);            //建立堆积树
   }

public static void heap(int data[] ,int size)
{
    int i,j,tmp;
    for(i=(size/2);i>0;i--)             //建立堆积树节点   
        MaxHeap.ad_heap(data,i,size-1);
    System.out.print("\n堆积内容:");
    for(i=1;i<size;i++)             //原始堆积树内容
        System.out.print("["+data[i]+"] ");
}

public static void ad_heap(int data[],int i,int size){
    int j,tmp,post;
    j=2*i;
    tmp=data[i];
    post=0;
    while(j<=size && post==0)
    {  
        if(j<size)
        {           
            //if(data[j]>data[j+1]) //小顶堆的比较            
            if(data[j]<data[j+1])   //找出两个子节点最大值
                j++;
        }
        //if(tmp<=data[j])          //小顶堆的比较
        if(tmp>=data[j])            //若树根较大,结束比较过程
            post=1;
        else
        {           
            data[j/2]=data[j];      //若树根较小,则继续比较,这里将最大子节点赋值给父节点
            j=2*j;
        }
   }
   data[j/2]=tmp;                   //指定树根为父节点
   }
}

6、执行结果

原始数组:[5] [6] [10] [8] [3] [2] [19] [9] [11]

堆积内容:[19] [11] [10] [9] [3] [2] [5] [6] [8]

       如果您喜欢我写的博文,读后觉得收获很大,不妨小额赞助我一下,让我有动力继续写出高质量的博文,感谢您的赞赏!!!

1
0
查看评论

堆排序,大顶堆,小顶堆

代码如下,有详细的注视 package com.collonn.algorithm.sort; /** * * 堆排序基本步骤,假设没有重复的元素 * 空间:为O(1) * 时间:N*logN * * 步骤1:构建大顶堆(或小顶堆) * 步骤2:将 堆顶 元素 与 未排...
  • collonn
  • collonn
  • 2014-02-10 15:50
  • 11283

【算法】堆,最大堆(大顶堆)及最小堆(小顶堆)的实现

转:http://blog.csdn.net/cdnight/article/details/11650983 此坑待埋。 点击打开漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析链接 白话经典算法系列之七 堆与堆排序 二叉排序树与二...
  • chen_lin111
  • chen_lin111
  • 2016-01-07 17:12
  • 8261

排序——堆排序-大根堆(大顶堆)

1.小根堆 若根节点存在左子女则根节点的值小于左子女的值;若根节点存在右子女则根节点的值小于右子女的值。 2.大根堆 若根节点存在左子女则根节点的值大于左子女的值;若根节点存在右子女则根节点的值大于右子女的值。 3.结论 (1)堆是一棵完全二叉树(如果公有h层,那么1~h-1层均满,在h层连续缺失若...
  • laoniu_c
  • laoniu_c
  • 2014-08-12 12:46
  • 3894

【算法】堆,最大堆(大顶堆)及最小堆(小顶堆)的实现

此坑待埋。 点击打开漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析链接 白话经典算法系列之七 堆与堆排序 二叉排序树与二叉堆 下面来说一说具体算法。
  • cdnight
  • cdnight
  • 2013-09-13 16:36
  • 56368

【算法设计与分析】5个数7次比较排序的算法

找到最快的算法,一直是计算机界的目标之一,而排序就是其中最基本的算法。什么样的排序才是最快的呢? 1.最少的比较次数,算法理论证明n个数排序,如果是基于比较的算法,至少需要 ㏒(n!) 向上取整数。下面给出小数目下,最少比较次数:     n 1 ...
  • theprinceofelf
  • theprinceofelf
  • 2011-08-08 10:42
  • 5140

堆排(大顶堆,小顶堆)

堆排(大顶堆,小顶堆) 分类: 数据结构 算法相关2009-10-15 12:26 2289人阅读 评论(4) 收藏 举报 汗,别人都说大小顶堆只是改改大于号的问题,可我的代码从大顶堆只改动大于号调整为小顶堆竟然越界乐,掣肘!! ...
  • jfkidear
  • jfkidear
  • 2012-02-17 13:40
  • 3125

堆的使用:使用小顶堆处理问题----查找几个数组中最大的k个数

原问题是:给定两个数组,求两个数组中最大的k个数 刚上来看到是两个数组以为要排序,后来发现2个数组其实也只是幌子,可以使用维持一个k个数的集合,进一个(依次)出一个(最小值)的方式来解决,最后全部过滤完留在集合里的就是最大的k个数,时间上需要考虑的就是(N-k)*time1(k)+time2(k),...
  • ljn799498049
  • ljn799498049
  • 2016-04-07 15:25
  • 529

Java 堆排序(大顶堆、小顶堆)

引用:http://lib.csdn.net/article/datastructure/8973 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复...
  • Sun_Ru
  • Sun_Ru
  • 2016-07-23 14:10
  • 5458

排序算法(三)堆排序原理与实现(小顶堆)

堆排序实际上是利用堆的性质来进行排序的,要知道堆排序的原理我们首先一定要知道什么是堆。 堆的定义: 堆实际上是一棵完全二叉树。 堆满足两个性质: 1、堆的每一个父节点都大于(或小于)其子节点; 2、堆的每个左子树和右子树也是一个堆。 堆的分类: 堆分为两类: 1、最大堆(大顶堆):堆...
  • her__0_0
  • her__0_0
  • 2017-05-19 00:17
  • 1824

topk--堆排序--小顶堆

【问题描述】 假设需要我们在一堆海量数据中找出排名前k的数据;最好的方法是用最小堆排序,直接用前k个数据建立一个小顶堆,然后遍历剩余的数, ①如果此数 ②如果此数>堆顶的数,则将此数和堆顶的数交换,然后从堆顶向下调整堆,使其重新满足小顶堆。 【说明】堆的存储 一般用数组来表示...
  • suibianshen2012
  • suibianshen2012
  • 2016-07-14 07:58
  • 1136
    【个人简介】
    姓名:余辉

    地点:北京昌平

    学历:中科院硕士

    QQ :348835027

    微信:silentwolfyh

    我的新书【点击图片】
    (京东)(天猫)(当当)

    本书QQ群:275243793
    个人资料
    • 访问:510664次
    • 积分:7841
    • 等级:
    • 排名:第3188名
    • 原创:286篇
    • 转载:23篇
    • 译文:24篇
    • 评论:95条
    博客专栏