Java优先队列的简单实现

最近在学习最小生成树时,用到了优先队列这个结构,琢磨这自己也来写下,搞了半天终于写出来了,于是就记录下

import java.util.ArrayList;

class MyHeap<Type  extends Comparable<Type>>{

  private ArrayList<Type> data;
  private int MaxSize;
  private int size;

  public MyHeap() {
      this.MaxSize=0;
      this.size=0;
  }

  public boolean add(Type Elem) {
      if(this.size>=this.MaxSize) {
          MaxSize=MaxSize+((MaxSize>>1)>1?(MaxSize>>1):1);
          ArrayList<Type>temp=new ArrayList<Type>(MaxSize);
          for(int i=0;i<this.size;++i) {
              temp.add(i, data.get(i));
          }
          data=temp;
      }
      data.add(Elem);
      int childIndex=this.size;
      Type childNode=data.get(size);
      while(childIndex>=0) {
          int parentIndex=(childIndex-1)>>1;
          if(parentIndex<0) {
             break;
          }
          if(data.get(parentIndex).compareTo(childNode)<0) {
              data.remove(childIndex);
              data.add(childIndex, data.get(parentIndex));
          }else {
              break;
          }
          childIndex=parentIndex;
      }
      data.remove(childIndex);
      data.add(childIndex, childNode);
      this.size+=1;
      return true;
  }
  public boolean showHeap() {
      for(int i=0;i<this.size;++i) {
          System.out.print(data.get(i)+" ");
      }
      return true;
  }

  public boolean delete(){
      if(this.size>=1){
        this.size-=1;
        data.add(1, data.get(this.size));
        data.remove(0);
        int parentIndex=0;
        Type parentNode=data.get(parentIndex);
        int Index=(parentIndex<<1)+1;
        while(Index+1<this.size) {
            if(data.get(Index).compareTo(data.get(Index+1))<0) {
                Index++;
            }
            if(data.get(Index).compareTo(parentNode)>0) {
                data.add(parentIndex, data.get(Index));
                data.remove(parentIndex+1);
            }
            else {
                break;
            }
            parentIndex=Index;
            Index=(parentIndex<<1)+1;
          }
       data.add(parentIndex, parentNode);
       data.remove(parentIndex+1);
       return true;
      }
      else {
          return false;
      }

    }
}

public class Main {
   public static void main(String[] args) {
    MyHeap<Integer>space=new MyHeap<Integer>();
    space.add(12);
    space.add(4);
    space.add(17);
    space.add(56);
    space.add(20);
    space.add(30);
    space.add(546);
    space.add(53);
    space.delete();
    space.showHeap();
    }
}

原文地址:https://www.cnblogs.com/z2529827226/p/11620666.html

时间: 2024-10-09 22:48:29

Java优先队列的简单实现的相关文章

LeetCode1046 最后一块石头的重量(贪心—Java优先队列简单应用)

题目: 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎:如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x.最后,最多只会剩下一块石头.返回此石头的重量.如果没有石头剩下,就返回 0. 提示: 1 <= stones.length <= 301 <= stones[i]

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

二、Java语言的简单认识及Hello World示例

1. Java语言的简单认识 (1) Java有三个版本: a. JAVA SE (以前称J2SE):Standard Environment 标准版本: b. JAVA EE (以前称J2EE):Enterprise Environment 企业版: c. JAVA ME (以前称J2ME):Eicro Environment 微型版; (2) Java的安装目录 在前一讲中,提到安装目录中有两个文件夹,分别是jdk1.7.0_45和jre7.在"jdk1.7.0_45"文件夹的bi

ZOJ 3447 Doraemon&#39;s Number Game(Java优先队列&#183;BigInteger)

题意  给你一个数组  你每次可以从中删掉2到k个数  然后把删掉的数的积加入到原数组  直到最后只剩一个数   求这样能得到的最大值和最小值的差 每次选的数值越小  选的数量越少  最后得到的结果肯定越大  因为这样大的数可以乘以最大的倍数  运算的次数也是最多从而使+1的次数最多  这显然是有利于最后结果的增大的 同理  每次选的数越大  选的数越多  最后得到的结果越小 这样最大值就是每次取最小的两个数  最大值就是每次取最大的k个数了   很容易用优先队列实现   结果会很大  用Jav

java设计之简单的JAVA计算器

做这个东西主要是为了练习一下以前学习过的java Swing,所以那些复杂的算法就没有加载到里面去........ 先展示一下效果....,额,当然不是这个样子....   ---> 代码: 1 package dialog_color; 2 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 import java.awt.Container; 6 import java.awt.FlowLayout; 7 import jav

利用java实现一个简单的远程监控程序

一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端,而且程序保持启动. (2) 被监控端获取本机的屏幕截屏发图给监控端. (3) 监控端在本地窗口中显示被监控端发送过来的图像. (4) (2)(3)步骤重复执行,这时在监控端即可实时监视到被监控端的桌面操作了. 功能二,远程控制 (1) 必须要有监控端与被监控端,而且程序保持启动. (2) 在监控端监

Java发邮件简单实现

给出一个Java发送邮件的简单实现. 下载 Java代码   1.  接口 public interface MailSendServDu { public void sendEmail(String addressee, String subject, String content); } 2.  实现 import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.Mime

Java的多线程 简单入门

Java的多线程 简单入门 首先可以先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位: 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程: 进程与线程区别与联系 (

java反射机制简单介绍

1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass();