最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于
一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足。
  今天所实现的堆排序(最大堆)算法,最小堆大同小异。然后基于最大堆实现最大优先队列,最大优先队列可应用于作
业调度,比如可将作业长度作为关键字值,实现最长作业优先;或者将作业优先权值作为关键字值,实现高优先权作业优先
执行等等。
最大堆排序算法结构如下图:

  

  1. //:ThinkingInJava/com.mindview.fundamental/MaxHeap.java
  2. package com.mindview.fundamental;
  3. /**
  4. *
  5. * @Time 2014-6-17
  6. * @Descri MaxHeap.java 最大堆排序实现算法
  7. * parent (i-1)/2
  8. * left 2*i+1
  9. * right 2*i+2
  10. * @author pattywgm
  11. *
  12. */
  13. public class MaxHeap {
  14. int a[];
  15. int a_heapsize;
  16. //接受数组
  17. public MaxHeap(int a[]) {
  18. this.a=a;
  19. a_heapsize=a.length;
  20. }
  21.  
  22. //堆排序
  23. public void heapSort(){
  24. buildMaxHeap();
  25. for(int i=a.length-1;i>0;i--){
  26. //从大到小输出,实际数组顺序输出为从小到大
  27. // System.out.print(a[0]+" ");
  28. exchange(0, i);
  29. a_heapsize=a_heapsize-1;
  30. maxHeapIFY(0);//from top to bottom
  31. }
  32. }
  33.  
  34. //创建堆
  35. public void buildMaxHeap(){
  36. //a[(a.length-1)/2] to a[0] is not leaf
  37. for(int i=(a.length/2-1);i>=0;i--){
  38. maxHeapIFY(i);
  39. }
  40. }
  41. //调整堆,以使其符合最大堆性质
  42. public void maxHeapIFY( int i) {
  43. int aLeft=2*i+1;//leftChild
  44. int aRight=2*i+2;//rightChild
  45. int largest;
  46. if(aLeft<a_heapsize && a[aLeft]>a[i])
  47. largest=aLeft;
  48. else
  49. largest=i;
  50. if(aRight<a_heapsize && a[aRight]>a[largest])
  51. largest=aRight;
  52. if(largest!=i){
  53. exchange(i,largest);
  54. //子树可能违反最大堆性质,继续调整
  55. maxHeapIFY(largest);
  56. }
  57.  
  58. }
  59. //exchange A[i] with A[largest]
  60. public void exchange(int i, int largest) {
  61. int temp=a[i];
  62. a[i]=a[largest];
  63. a[largest]=temp;
  64.  
  65. }
  66. }
  67.  
  68. ///:~

  其中buildMaxHeap()实现建立最大堆,HeapSort()方法首先调用该方法建立最大堆,然后获取堆顶元素即为最大元素,
将其与堆底最后一个元素交换后输出到数组中,此时得到新的堆大小,并通过maxHeapIFY()方法继续调整堆,以使堆能够
满足最大堆性质。循环迭代该过程,即可实现最大堆的排序,数组中最后保存的元素顺序是从小到大的。
最大优先队列算法结构图如下:

  1. //:ThinkingInJava/com.mindview.fundamental/MaxPriorityQueue.java
  2. package com.mindview.fundamental;
  3. /**
  4. *
  5. * @Time 2014-6-17
  6. * @Descri MaxPriorityQueue.java
  7. * 基于最大堆,实现最大优先队列,最大优先队列应用于作业调度
  8. * 可将作业长度作为关键字,进行比较
  9. * @author pattywgm
  10. *
  11. */
  12. public class MaxPriorityQueue {
  13. int task[];
  14. MaxHeap heap;
  15. public MaxPriorityQueue(int[] task) {
  16. this.task=task;
  17. heap=new MaxHeap(task);
  18. heap.buildMaxHeap();//创建最大堆
  19. }
  20. //获取最大关键字
  21. public int heapMaxiMum(){
  22. return task[0];
  23. }
  24. //去掉并返回最大关键字
  25. public int heapExtractMax(){
  26. if(heap.a_heapsize<1){
  27. System.out.println("Error:heap underflow");
  28. return -1;
  29. }
  30. else{
  31. int max=task[0];
  32. task[0]=task[heap.a_heapsize-1];
  33. heap.a_heapsize=heap.a_heapsize-1;
  34. heap.maxHeapIFY(0);
  35. return max;
  36. }
  37. }
  38. //在堆中插入元素x
  39. public void heapInsert(int x){
  40. task[heap.a_heapsize]=-1;
  41. System.out.println("insert: "+heap.a_heapsize);
  42. heap.a_heapsize=heap.a_heapsize+1;
  43. if(heap.a_heapsize>task.length){
  44. System.out.println("Error:array overflow");
  45. return;
  46. }
  47. else{
  48. heapIncreaseKey(heap.a_heapsize-1,x);
  49. }
  50. }
  51. //将元素x值增加到key
  52. public void heapIncreaseKey(int i,int key){
  53. if(task[i]>=key){
  54. System.out.println("new key is not bigger than current key");
  55. return;
  56. }
  57. else{
  58. task[i]=key;
  59. //parent: (i-1)/2
  60. while(i>0 && task[(i-1)/2]<task[i]){
  61. heap.exchange(i, (i-1)/2);
  62. i=(i-1)/2;
  63. }
  64. }
  65. }
  66.  
  67. public void print(){
  68. for(int i=0;i<heap.a_heapsize;i++){
  69. System.out.print(task[i]+" ");
  70. }
  71. }
  72.  
  73. }
  74.  
  75. ///:~

  初始化调用MaxHeap类的buildMaxHeap()实现建立最大堆,即初始的最大优先队列。该最大优先队列支持以下操作:
    1)heapMaxiMum():获取最大关键字值(依据最大堆性质,实际上只是获取堆顶元素)
    2)heapExtractMax():去掉并返回最大关键字值,此时应注意重新调整堆(包括堆的大小和重新排列)
    3)heapInsert(key):在现有队列中插入元素key,该操作与4)结合实现
    4) heapIncreaseKey(i,key):将队列中指定位置处的值增加到key,注意值增加后堆性质的满足与否并做出相
    应调整
  映射到作业调度的问题,可将作业优先权值作为关键字值,1)或 2)操作获取当前作业队列中具有最高优先权的作业
进行调度, 2)操作更符合实际情况,在调度的同时更新队列;3)操作当有新的作业到来时将其插入优先权队列,并遵守
最大优先权最先执行的原则;4)操作在作业执行过程中,可能某个在优先权队列中的作业急需被调用,而其当前优先权却
不高,那么就需要提高其优先权,以使其能够被尽早调度。

java基础之:堆排序的更多相关文章

  1. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  2. Java基础学习经验分享

    很多人学习Java,尤其是自学的人,在学习的过程中会遇到各种各样的问题以及难点,有时候卡在一个点上可能需要很长时间,因为你在自学的过程中不知道如何去掌握和灵活运用以及该注意的点.下面我整理了新手学习可 ...

  3. 精心收集java基础106条

    Java基础 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public ...

  4. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

  5. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  6. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  7. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  8. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  9. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

随机推荐

  1. Oracle调整联机日志大小

    近期一个项目反馈月底高峰期时系统整体性能下降,抓取对应的AWR和ASH查看,等待事件排第一位的竟然是redo日志切换.进一步看每秒的日志量是5M多,而日志文件大小仅有200M.建议项目上调整日志大小, ...

  2. I do not want to inherit the child opacity from the parent in CSS(不想让子元素继承父元素的透明度)

    Instead of using opacity, set a background-color with rgba, where 'a' is the level of transparency. ...

  3. 使用-MM生成include指令和依赖生成(make include directive and dependency generation with -MM)

    I want a build rule to be triggered by an include directive if the target of the include is out of d ...

  4. C++常见gcc编译链接错误解决方法

    除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...

  5. 字符串--java中判断字符串是否为数字的方法的几种方法?

    ava中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...

  6. view抖动效果

    1.使用属性动画 ViewPropertyAnimator.animate(webView).translationX(20).setInterpolator(new CycleInterpolato ...

  7. SG函数闲扯(转)

    http://ydcydcy1.blog.163.com/blog/static/216089040201342412717440/ 没来得及看.

  8. 网络换行符替换为word换行符

    在替换的页面上,查找里输入:^l,在替换里输入:^p,然后点击替换即可.

  9. iOS开发--一些UITabBarItem属性的设置[转]

    1.改变UITabBarItem 字体颜色 [[UITabBarItemappearance]setTitleTextAttributes:[NSDictionary dictionaryWithOb ...

  10. Spark SQL External Data Sources JDBC简易实现

    在spark1.2版本中最令我期待的功能是External Data Sources,通过该API可以直接将External Data Sources注册成一个临时表,该表可以和已经存在的表等通过sq ...