欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-04-01 23:11:52
这里主要介绍的是优先队列的二叉堆java实现,代码如下: package practice; import edu.princeton.cs.algs4.std...

这里主要介绍的是优先队列的二叉堆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编程接口调用的作用及代码分享java并发学习之blockingqueue实现生产者消费者详解等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!