最大优先序列的java实现
2016-02-27 19:05
483 查看
public class Priority_Queue { private static int heap_size = 0; public static int Parent(int i){ return (i-1)/2; } public static void Max_Heapify(double[] A, int i){ int l = 2*i + 1; int r = 2*i + 2; int largest; if (l <= heap_size - 1 && A[l] > A[i]){ largest = l; }else { largest = i; } if (r <= heap_size - 1 && A[r] > A[largest]){ largest = r; } if (largest != i){ double x = A[i]; A[i] = A[largest]; A[largest] = x; Max_Heapify(A, largest); } } public static void Build_Max_Heapify(double[] A){ heap_size = A.length; for (int i = A.length/2; i >= 0; i--){ Max_Heapify(A, i); } } /** * 堆排序 * @param A */ public static void Heap_Sort(double[] A){ heap_size = A.length; Build_Max_Heapify(A); for (int i = A.length - 1; i >= 1; i--){ double x = A[0]; A[0] = A[i]; A[i] = x; heap_size--; Max_Heapify(A, 0); } } /** * 返回堆A中具有最大关键字的元素 * @param A A必须已经是最大堆 * @return */ public static double Heap_Maximum(double[] A){ return A[0]; } /** * 去掉并返回A中的具有最大关键字的元素 * @param A A必须已经是最大堆 * @return * @throws Exception */ public static double Heap_Extract_Max(double[] A) throws Exception{ if (heap_size < 1){ throw new Exception("heap underflow"); } double max = A[0]; A[0] = A[heap_size - 1]; heap_size--; Max_Heapify(A,0); return max; } /** * 将元素A[i]的关键字增加到key * @param A A必须已经是最大堆 * @param i * @param key * @throws Exception */ public static void Heap_Increase_Key(double[] A, int i, double key) throws Exception{ if (key < A[i]){ throw new Exception("new key is smaller than current key"); } A[i] = key; while (i > 0 && A[Parent(i)] < A[i]){ double x = A[i]; A[i] = A[Parent(i)]; A[Parent(i)] = x; i = Parent(i); } } /** * 把元素key插入到最大堆A中 * @param A A必须已经是最大堆 * @param key * @throws Exception */ public static void Max_Heap_Insert(double[] A, double key) throws Exception{ heap_size--; A[heap_size] = -10000000; Heap_Increase_Key(A, heap_size, key); } public static void print(double[] A){ for (int i = 0; i < A.length; i++){ System.out.print(A[i] + " "); } System.out.println(); } public static double[] copy_array(double[] A){ double[] B = new double[A.length]; for (int i = 0; i < A.length; i++){ B[i] = A[i]; } return B; } public static void main(String[] args) throws Exception{ double[] A = {12, 51, 54, 2, 51, 32, 35, 26, 78, 96, 20, 34, 56, 41, 72, 100, 34, 8, 61, 94, 52, 10}; double[] B = copy_array(A); Heap_Sort(B); System.out.print("Insertion_Sort: "); print(B); B = copy_array(A); Build_Max_Heapify(B); print(B); System.out.println(Heap_Maximum(B)); System.out.println(Heap_Extract_Max(B)); print(B); } }
相关文章推荐
- JAVA同时查看一个类的继承关系(Eclipse快键)
- java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
- java的反射机制
- Java基础(移位,函数)
- eclipse常用操作技巧
- Java如何获取文件编码格式
- mac 安装maven 和改动java环境变量
- java 乱码问题-Dfile.encoding=UTF-8
- Java动态加载jar文件
- java中基本输入输出流的解释
- Java异常机制
- Java设计模式--策略模式
- java设计模式(四)--单例模式
- spring学习笔记 - 面试题
- java 用嵌套for循环实现九九乘法表各种形状的展现
- Hello World!(Error opening registry key'software\Javasoft\Java Runtime Environment')
- java排序之插入排序(直接插入排序和希尔排序)
- 个人学习-java-单例设计模式
- android eclipse 将项目中assets文件夹下的数据库文件存储到data/data/包名/databases下
- 安卓 java.lang.StackOverflowError 错误检查,特别是部分低端机型