`

java最小根堆实现

 
阅读更多

1.堆结点 

Java代码  收藏代码
  1. package boke.heap1;  
  2.   
  3. /** 
  4.  * 堆结点 
  5.  *  
  6.  * @since jdk1.5及其以上 
  7.  * @author 毛正吉 
  8.  * @version 1.0 
  9.  * @date 2010.05.24 
  10.  *  
  11.  */  
  12. public class Node {  
  13.     private int iData; // 结点数据是整型  
  14.   
  15.     public Node(int key) {  
  16.         iData = key;  
  17.     }  
  18.   
  19.     /** 
  20.      * setKey 
  21.      *  
  22.      * @param id 
  23.      */  
  24.     public void setKey(int id) {  
  25.         iData = id;  
  26.     }  
  27.   
  28.     /** 
  29.      * getKey 
  30.      *  
  31.      * @return 
  32.      */  
  33.     public int getKey() {  
  34.         return iData;  
  35.     }  
  36. }  

2. 最小堆 

Java代码  收藏代码
  1. package boke.heap1;  
  2.   
  3. import boke.heap.Node;  
  4.   
  5. /** 
  6.  * 最小堆 
  7.  *  
  8.  * @since jdk1.5及其以上 
  9.  * @author 毛正吉 
  10.  * @version 1.0 
  11.  * @date 2010.05.24 
  12.  *  
  13.  */  
  14. public class MinHeap {  
  15.     private Node[] heapArray; // 堆容器  
  16.     private int maxSize; // 堆得最大大小  
  17.     private int currentSize; // 堆大小  
  18.   
  19.     public MinHeap(int _maxSize) {  
  20.         maxSize = _maxSize;  
  21.         heapArray = new Node[maxSize];  
  22.         currentSize = 0;  
  23.     }  
  24.   
  25.     /** 
  26.      * 自上而下调整 
  27.      *  
  28.      * @param start 
  29.      * @param endOfHeap 
  30.      */  
  31.     public void filterDown(int start, int endOfHeap) {  
  32.         int i = start;  
  33.         int j = 2 * i + 1// j是i的左子女位置  
  34.         Node temp = heapArray[i];  
  35.   
  36.         while (j <= endOfHeap) { // 检查是否到最后位置  
  37.             if (j < endOfHeap // 让j指向两子女中的小者  
  38.                     && heapArray[j].getKey() > heapArray[j + 1].getKey()) {  
  39.                 j++;  
  40.             }  
  41.             if (temp.getKey() <= heapArray[j].getKey()) { // 小则不做调整  
  42.                 break;  
  43.             } else { // 否则小者上移,i,j下降  
  44.                 heapArray[i] = heapArray[j];  
  45.                 i = j;  
  46.                 j = 2 * j + 1;  
  47.             }  
  48.         }  
  49.         heapArray[i] = temp;  
  50.     }  
  51.   
  52.     /** 
  53.      * 自下而上的调整:从结点start开始到0为止,自下向上比较,如果子女的值小于双亲结点的值则互相交换 
  54.      *  
  55.      * @param start 
  56.      */  
  57.     public void filterUp(int start) {  
  58.         int j = start;  
  59.         int i = (j - 1) / 2;  
  60.         Node temp = heapArray[j];  
  61.   
  62.         while (j > 0) { // 沿双亲结点路径向上直达根节点  
  63.             if (heapArray[i].getKey() <= temp.getKey()) {// 双亲结点值小,不调整  
  64.                 break;  
  65.             } else {// 双亲结点值大,调整  
  66.                 heapArray[j] = heapArray[i];  
  67.                 j = i;  
  68.                 i = (i - 1) / 2;  
  69.             }  
  70.             heapArray[j] = temp; // 回送  
  71.         }  
  72.     }  
  73.   
  74.     /** 
  75.      * 堆中插入结点 
  76.      *  
  77.      * @param key 
  78.      * @return 
  79.      * @throws MinHeapException 
  80.      */  
  81.     public boolean insert(int key) throws MinHeapException {  
  82.         boolean bool = true;  
  83.         if (isFull()) {  
  84.             bool = false;  
  85.             throw new MinHeapException("MinHeap is full!");  
  86.         } else {  
  87.             Node newNode = new Node(key);  
  88.             heapArray[currentSize] = newNode;  
  89.             filterUp(currentSize);  
  90.             currentSize++;  
  91.         }  
  92.         return bool;  
  93.     }  
  94.   
  95.     /** 
  96.      * 删除堆中的最小值 
  97.      *  
  98.      * @return 
  99.      * @throws MinHeapException 
  100.      */  
  101.     public Node removeMin() throws MinHeapException {  
  102.         if (isEmpty()) {  
  103.             throw new MinHeapException("MinHeap is empty!");  
  104.         }  
  105.         Node root = heapArray[0];  
  106.         heapArray[0] = heapArray[currentSize - 1];  
  107.         currentSize--;  
  108.         filterDown(0, currentSize - 1);  
  109.         return root;  
  110.     }  
  111.   
  112.     /** 
  113.      * 按某种格式输出堆 
  114.      */  
  115.     public void displayHeap() {  
  116.         System.out.print("heapArray: ");  
  117.         for (int i = 0; i < currentSize; i++) {  
  118.             if (heapArray[i] != null) {  
  119.                 System.out.print(heapArray[i].getKey() + " ");  
  120.             } else {  
  121.                 System.out.print("-- ");  
  122.             }  
  123.         }  
  124.         System.out.println();  
  125.   
  126.         int nBlanks = 32// heap format  
  127.         int itemsPerRow = 1;  
  128.         int column = 0;  
  129.         int j = 0// current item  
  130.         String dots = "...............................";  
  131.         System.out.println(dots + dots); // dotted top line  
  132.   
  133.         while (currentSize > 0) { // for each heap item  
  134.             if (column == 0) { // first item in row  
  135.                 for (int k = 0; k < nBlanks; k++) { // preceding blanks  
  136.                     System.out.print(" ");  
  137.                 }  
  138.             }  
  139.             System.out.print(heapArray[j].getKey()); // display item  
  140.   
  141.             if (++j == currentSize) { // done?  
  142.                 break;  
  143.             }  
  144.   
  145.             if (++column == itemsPerRow) { // end of row?  
  146.                 nBlanks /= 2// half the blanks  
  147.                 itemsPerRow *= 2// twice the items  
  148.                 column = 0// start over on  
  149.                 System.out.println(); // next row  
  150.             } else { // next item on row  
  151.                 for (int k = 0; k < nBlanks * 2 - 2; k++) {  
  152.                     System.out.print(' '); // interim blanks  
  153.                 }  
  154.             }  
  155.         }  
  156.         System.out.println("\n" + dots + dots);  
  157.     }  
  158.   
  159.     public boolean isEmpty() {  
  160.         return currentSize == 0;  
  161.     }  
  162.   
  163.     public boolean isFull() {  
  164.         return currentSize == maxSize;  
  165.     }  
  166.   
  167.     public void makeEmpty() {  
  168.         currentSize = 0;  
  169.     }  
  170. }  

3. 堆异常 

Java代码  收藏代码
  1. package boke.heap1;  
  2.   
  3. /** 
  4.  * 堆异常 
  5.  *  
  6.  * @since jdk1.5及其以上 
  7.  * @author 毛正吉 
  8.  * @version 1.0 
  9.  * @date 2010.05.24 
  10.  *  
  11.  */  
  12. public class MinHeapException extends Exception {  
  13.     public MinHeapException() {  
  14.         super("MinHeapException");  
  15.     }  
  16.   
  17.     public MinHeapException(String exMsg) {  
  18.         super(exMsg);  
  19.     }  
  20. }  

4.  最小堆应用测试 

Java代码  收藏代码
  1. package boke.heap1;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. /** 
  8.  * 最小堆应用测试 
  9.  *  
  10.  * @since jdk1.5及其以上 
  11.  * @author 毛正吉 
  12.  * @version 1.0 
  13.  * @date 2010.05.24 
  14.  *  
  15.  */  
  16. public class MinHeapApp {  
  17.   
  18.     /** 
  19.      * @param args 
  20.      * @throws IOException 
  21.      * @throws MinHeapException 
  22.      */  
  23.     public static void main(String[] args) throws IOException, MinHeapException {  
  24.         int value, value2;  
  25.         MinHeap hp = new MinHeap(31);  
  26.         boolean success;  
  27.   
  28.         hp.insert(53);  
  29.         hp.insert(17);  
  30.         hp.insert(78);  
  31.         hp.insert(9);  
  32.         hp.insert(45);  
  33.         hp.insert(65);  
  34.         hp.insert(87);  
  35.         hp.insert(23);  
  36.   
  37.         while (true) {  
  38.             System.out.print("Enter first letter of ");  
  39.             System.out.print("show, insert, remove: ");  
  40.             int choice = getChar();  
  41.   
  42.             switch (choice) {  
  43.             case 's':  
  44.                 hp.displayHeap();  
  45.                 break;  
  46.             case 'i':  
  47.                 System.out.print("Enter value to insert: ");  
  48.                 value = getInt();  
  49.                 success = hp.insert(value);  
  50.                 if (!success) {  
  51.                     System.out.println("Can't insert; heap is full");  
  52.                 }  
  53.                 break;  
  54.             case 'r':  
  55.                 if (!hp.isEmpty()) {  
  56.                     hp.removeMin();  
  57.                 } else {  
  58.                     System.out.println("Can't remove; heap is empty");  
  59.                 }  
  60.                 break;  
  61.             default:  
  62.                 System.out.println("Invalid entry\n");  
  63.             }  
  64.         }  
  65.   
  66.     }  
  67.   
  68.     /** 
  69.      * 获得控制台输入流 
  70.      *  
  71.      * @return 
  72.      * @throws IOException 
  73.      */  
  74.     public static String getString() throws IOException {  
  75.         return new BufferedReader(new InputStreamReader(System.in)).readLine();  
  76.     }  
  77.   
  78.     /** 
  79.      * 获得控制台输入字符 
  80.      *  
  81.      * @return 
  82.      * @throws IOException 
  83.      */  
  84.     public static char getChar() throws IOException {  
  85.         return getString().charAt(0);  
  86.     }  
  87.   
  88.     /** 
  89.      * 获得控制台输入整型 
  90.      *  
  91.      * @return 
  92.      * @throws NumberFormatException 
  93.      * @throws IOException 
  94.      */  
  95.     public static int getInt() throws NumberFormatException, IOException {  
  96.         return Integer.parseInt(getString());  
  97.     }  
  98.   
  99. }  

分享到:
评论

相关推荐

    堆排序7.java 使用java实现的堆排序

    堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆...

    二叉堆最小堆的Java实现

    个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 可在外部写脚本对该文件进行测试 需要继承Tuple类实现排序对象类型,并实现Tuple的抽象方法weight()来反映排序对象权重

    堆排序12.java 使用java代码实现

    堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用...

    堆排序10.java 使用java来实现

    堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆...

    MyLineRegression_最小二乘法的Java实现_

    最小二乘法原理十分简单,这里不再赘述。对于预测公式y' = a * x + b,最优解如下double a = Sxy / Sxx;double b = yAvg - a * xAvg;double r = Sxy / Math.sqrt(Sxx * Syy);其中,r为相关系数,绝对值越大,线性...

    堆排序(最小堆)的相关演示(java_swing版)

    本人编写的堆排序及堆的插入删除等操作演示,用的是java swing,详情可以查看 http://blog.csdn.net/cdnight/article/details/11714005 假如您对堆排序不是很熟悉,可以查看 ...

    java最小生成树

    采用堆排序实现带权值的边的顺序排列 利用克鲁斯卡尔算法实现最小生成树 首先 n城市之间全连接 输出所有连接和其边的权值 最后输出n个城市之间通信代价最小的最小生成树。 可用于java数据结构课程设计:“若要在n个...

    Java实现堆排序

    Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C

    用Java实现的堆排序算法

    用Java实现的堆排序算法,二叉树转换为堆,然后排序

    java实现一元、多元、对数、指数等拟合(最小二乘法拟合直线、曲线)

    java实现一元、多元、对数、指数等拟合(最小二乘法拟合直线、曲线)

    java实现最小化到托盘

    通过查看网上的代码,用java简单的实现了最小化到托盘的GUI的小demo。 希望能对需要的人有所帮助

    Java编写的用最小二乘拟合曲线(带图形)

    java,数值计算,曲线拟合,最小二乘,带画图,程序中数据都是固定的如果想应用于其他数据可自行更改,很easy。

    Java实现堆并调整

    Java实现堆的建立和堆的向下向上调整,heap。环境Java eclipes1.8

    最大(小)堆Java实现

    代码只是实现了最大堆的顺序存储,插入,删除,筛选建立

    堆排序 java实现

    堆排序 java实现

    java 实现二叉排序树 堆

    java 实现二叉排序树

    java语言实现求素数的原根

    java语言实现求素数的原根的源代码 输入一个素数 求出他所有的原根 密码学相关 java语言实现求素数的原根的源代码 输入一个素数 求出他所有的原根 密码学相关

    java使用小根堆实现优先级队列的几种方式

    NULL 博文链接:https://yunjiechao-163-com.iteye.com/blog/2405056

    用Java利用prim算法实现最小生成树

    标题: 最小生成树 时 限: 1000 ms 内存限制: 10000 K 总时限: 3000 ms 描述: 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后...

Global site tag (gtag.js) - Google Analytics