java编程实现优先队列的二叉堆代码分享

 更新时间:2017年11月09日 15:55:18   作者:zhangqi66  
这篇文章主要介绍了java编程实现优先队列的二叉堆代码分享,具有一定参考价值,需要的朋友可以了解下。

这里主要介绍的是优先队列的二叉堆Java实现,代码如下:

package practice;
import edu.princeton.cs.algs4.StdRandom;
public class TestMain {
  public static void main(String[] args) {
    int[] a = new int[20];
    for (int i = 0; i < a.length; i++) {
      int temp = (int)(StdRandom.random()*100);
      a[i] = temp;
    }
    for (int i : a) {
      System.out.print(i+" ");
    }
    System.out.println();
    PQHeap pq = new PQHeap();
    for (int i = 0; i < 20; i++) {
      pq.insert(a[i]);
    }
    System.out.println();
    for (int i = 0; i < 20; i++) {
      System.out.print(pq.delMax()+" ");
    }
  }
}
/*
 * 优先队列的堆实现
 * 二叉堆,每个元素有两个子元素,两个子元素均比自己小
 */
class PQHeap{
  private int[] a;
  private int p = 1;
  public PQHeap() {
    a = new int[2];
  }
  /*
   * 插入元素
   */
  public void insert(int elements) {
    if (p == a.length) { resize(a.length*2); }
    a[p++] = elements;
    swim(p - 1); //将刚插入的元素上浮到正确位置
  }
  /*
   * 返回并删除最大元素
   */
  public int delMax() {
    if (p == a.length/4) { resize(a.length/2); }
    int result = a[1]; //找出最大元素
    exch(1, --p); //将最后一个元素移到顶端
    a[p] = 0; 
    sink(1); //将刚移上去的元素沉下去,使堆有序
    return result;
  }
  public boolean isEmpty() {
    return p == 0;
  }
  public int size() {
    return p;
  }
  public void show() {
    for (int i : a) {
      System.out.print(i+" ");
    }
    System.out.println();
  }
  /*
   * 上浮元素
   */
  private void swim(int k) { //将元素与父元素比较,比父元素大则换位置
    while (k > 1 && a[k/2] < a[k]) { 
      exch(k/2, k);
      k = k/2;
    }
  }
  private void sink(int k) { //将元素与子元素比较,比子元素小则和两个中较大的那个换位置
    while (2*k < p && (a[k] < a[2*k + 1]) || (a[k] < a[2*k])) {
      if (a[2*k + 1] > a[2*k]) { exch(k, 2*k + 1); k = 2*k + 1; }
      else           { exch(k, 2*k); k = 2*k; }
    }
  }
  private void resize(int length) {
    int[] b = new int[length]; //将数组长度改变
    for (int i = 0; i < p; i++) { //将数组复制
      b[i] = a[i];
    }
    a = b; //让a指向b的内存空间
  }
  /*
   * 交换
   */
  private void exch (int i, int j) {
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
  }
}

总结

以上就是本文关于java编程实现优先队列的二叉堆代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:java集合中list的用法代码示例Java编程接口调用的作用及代码分享java并发学习之BlockingQueue实现生产者消费者详解等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

相关文章

  • Java synchronized重量级锁实现过程浅析

    Java synchronized重量级锁实现过程浅析

    这篇文章主要介绍了Java synchronized重量级锁实现过程,synchronized是Java里的一个关键字,起到的一个效果是"监视器锁",它的功能就是保证操作的原子性,同时禁止指令重排序和保证内存的可见性
    2023-02-02
  • Java9中接口的私有方法详解

    Java9中接口的私有方法详解

    印象中Java 接口就没有论述私有方法这回事。既然 Java 9 添加了这项特性,那么,应该就有它的用途,我们一起来看看 Java 9 中的接口的私有方法是什么样的吧
    2023-04-04
  • 如何理解Java线程池及其使用方法

    如何理解Java线程池及其使用方法

    线程池是首先创建一些线程,它们的集合称为线程池。使用线程池可以提高性能,它在系统启动时创建大量空闲的线程,程序将一个任务传给线程池,它就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务
    2021-06-06
  • Spring Boot 项目发布到 Tomcat 服务器的操作步骤

    Spring Boot 项目发布到 Tomcat 服务器的操作步骤

    这篇文章主要介绍了Spring Boot 项目发布到 Tomcat 服务器的操作步骤,需要的朋友可以参考下
    2017-04-04
  • Java使用MySQL实现连接池代码实例

    Java使用MySQL实现连接池代码实例

    这篇文章主要介绍了Java使用MySQL实现连接池代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringMVC底层执行流程及原理解析

    SpringMVC底层执行流程及原理解析

    这篇文章主要介绍了SpringMVC底层执行流程及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • springMVC4之强大类型转换器实例解析

    springMVC4之强大类型转换器实例解析

    本篇文章主要介绍了springMVC4之强大类型转换器实例解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • servlet过滤器(Filter)详解(九)

    servlet过滤器(Filter)详解(九)

    这篇文章主要为大家详细介绍了servlet过滤器Filter的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java HashMap算法原理详细讲解

    Java HashMap算法原理详细讲解

    在java开发中,HashMap是最常用、最常见的集合容器类之一,文中通过示例代码介绍HashMap为啥要二次Hash,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Java中BigDecimal比较大小的3种方法(​​compareTo()、​​equals()​​和​​compareTo()​​)

    Java中BigDecimal比较大小的3种方法(​​compareTo()、​​equals()​​和​​compar

    这篇文章主要给大家介绍了关于Java中BigDecimal比较大小的3种方法,方法分别是​​compareTo()、​​equals()​​和​​compareTo()​​,在Java中使用BigDecimal类来进行精确的数值计算,需要的朋友可以参考下
    2023-11-11

最新评论