1. package org.rut.util.algorithm.support;
  2.  
  3. import org.rut.util.algorithm.SortUtil;
  4.  
  5. public class HeapSort implements SortUtil.Sort{
  6.  
  7. /* (non-Javadoc)
  8. * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
  9. */
  10. public void sort(int[] data) {
  11. MaxHeap h=new MaxHeap();
  12. h.init(data);
  13. for(int i=0;i<data.length;i++)
  14. h.remove();
  15. System.arraycopy(h.queue,1,data,0,data.length);
  16. }
  17.  
  18. private static class MaxHeap{
  19.  
  20. void init(int[] data){
  21. this.queue=new int[data.length+1];
  22. for(int i=0;i<data.length;i++){
  23. queue[++size]=data<i>;
  24. fixUp(size);
  25. }
  26. }
  27.  
  28. private int size=0;
  29.  
  30. private int[] queue;
  31.  
  32. public int get() {
  33. return queue[1];
  34. }
  35.  
  36. public void remove() {
  37. SortUtil.swap(queue,1,size--);
  38. fixDown(1);
  39. }
  40. //fixdown
  41. private void fixDown(int k) {
  42. int j;
  43. while ((j = k << 1) <= size) {
  44. if (j < size && queue[j]<queue[j+1])
  45. j++;
  46. if (queue[k]>queue[j]) //不用交换
  47. break;
  48. SortUtil.swap(queue,j,k);
  49. k = j;
  50. }
  51. }
  52. private void fixUp(int k) {
  53. while (k > 1) {
  54. int j = k >> 1;
  55. if (queue[j]>queue[k])
  56. break;
  57. SortUtil.swap(queue,j,k);
  58. k = j;
  59. }
  60. }
  61.  
  62. }
  63.  
  64. }
  65.  
  66. SortUtil
  67.  
  68. package org.rut.util.algorithm;
  69.  
  70. import org.rut.util.algorithm.support.BubbleSort;
  71. import org.rut.util.algorithm.support.HeapSort;
  72. import org.rut.util.algorithm.support.ImprovedMergeSort;
  73. import org.rut.util.algorithm.support.ImprovedQuickSort;
  74. import org.rut.util.algorithm.support.InsertSort;
  75. import org.rut.util.algorithm.support.MergeSort;
  76. import org.rut.util.algorithm.support.QuickSort;
  77. import org.rut.util.algorithm.support.SelectionSort;
  78. import org.rut.util.algorithm.support.ShellSort;
  79.  
  80. public class SortUtil {
  81. public final static int INSERT = 1;
  82. public final static int BUBBLE = 2;
  83. public final static int SELECTION = 3;
  84. public final static int SHELL = 4;
  85. public final static int QUICK = 5;
  86. public final static int IMPROVED_QUICK = 6;
  87. public final static int MERGE = 7;
  88. public final static int IMPROVED_MERGE = 8;
  89. public final static int HEAP = 9;
  90.  
  91. public static void sort(int[] data) {
  92. sort(data, IMPROVED_QUICK);
  93. }
  94. private static String[] name={
  95. "insert", "bubble", "selection", "shell", "quick", "improved_quick", "merge", "improved_merge", "heap"
  96. };
  97.  
  98. private static Sort[] impl=new Sort[]{
  99. new InsertSort(),
  100. new BubbleSort(),
  101. new SelectionSort(),
  102. new ShellSort(),
  103. new QuickSort(),
  104. new ImprovedQuickSort(),
  105. new MergeSort(),
  106. new ImprovedMergeSort(),
  107. new HeapSort()
  108. };
  109.  
  110. public static String toString(int algorithm){
  111. return name[algorithm-1];
  112. }
  113.  
  114. public static void sort(int[] data, int algorithm) {
  115. impl[algorithm-1].sort(data);
  116. }
  117.  
  118. public static interface Sort {
  119. public void sort(int[] data);
  120. }
  121.  
  122. public static void swap(int[] data, int i, int j) {
  123. int temp = data<i>;
  124. data<i> = data[j];
  125. data[j] = temp;
  126. }
  127. }

Java算法-堆排序的更多相关文章

  1. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  2. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  8. java算法----排序----(5)归并排序

    package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...

  9. java算法----排序----(4)快速排序

    package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...

随机推荐

  1. HDU 4964 Emmet --模拟

    题意:给你一个字符串,要求把它按语法转化成HTML格式. 分析:这题其实不难,就是一个递归的事情,当时忽略了括号嵌套的情况,所以一直WA,后来加上这种情况后就过了.简直醉了. 处理id和class时, ...

  2. eclipse菜单解释及中英对照《二》

    上篇文章主要介绍了eclipse中每个大的标题下的中英文及其用法. 感谢http://blog.csdn.net/li_jinjian2005/article/details/2831641这个博主. ...

  3. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. linux如何挂载windows下的共享文件

    说明:windows下有一共享文件夹APP,windows本地ip是192.168.9.155现在需要在linux服务器上挂载这个APP文件夹,linux服务器ip是192.168.9.200 操作记 ...

  5. git review报错一例

    在线上修改代码,最后使用git review提交代码审核的时候出现报错如下:[wangshibo@115~]$ vim testfile           #修改代码[wangshibo@115~] ...

  6. js判断滚动条到底部

    判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop.clientHeight.scrollHeight. scrollTop为滚动条在Y轴上的滚动距离. clientHeight为内容 ...

  7. zepto源码注解

    /* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...

  8. 26Spring_的注解实际应用_关键整理一下之前的注解

    写一个银行转账案例, 案例结构如下:

  9. 【转】【C#】判断两个文件是否相同

    使用System.security.Cryptography.HashAlgorithm类为每个文件生成一个哈希码,然后比较两个哈希码是否相同 该哈希算法为一个文件生成一个小的二进制“指纹”,从统计学 ...

  10. [转]hive实例讲解实现in和not in子句

    FROM : http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842855.html 目前hive不支持 in或not in 中包含查询子句的 ...