经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
堆排序前序之队列优先级
来源:cnblogs  作者:不刷完题不改名  时间:2018/10/16 9:17:21  对本文有异议

应用场景:

  对于现在的计算机来说,同时可以运行多个程序,加上操作系统里面一大堆的进程,操作系统经常会处理各个进程的排序,从而有条不紊运行各种程序。

  在这种情况下,需要一种数据结构且需要以下的功能:删除最大元素和插入元素,这种类型叫做优先队列。

提供的方法:

  常用的排序算法之中的exch()交换方法,less()比较方法,此外还提供了插入方法insert()和删除最大的方法delMax(),以及由此生成的上浮方法swim()和下沉的方法sink()。

原理:

  概念成形图:
    

    从图中可以明显的看出:若将一个数组的所有数据按照图示的顺序排放在一个堆种,且int型数据之中,可以发现每个节点(除开根节点)的的父节点均是当前节点的1/2,即4/2 = 2,5/2=2,得到的总是它的父节点;

    这样就为我门提供了思路:想要一个这样的堆是有序的话,将其中的节点和它的上下节点做对比,如果它比子节点小就和子节点交换位置,如果比父节点大就和父节点交换位置,这两种交换就像泡泡上浮,下沉的样子;所以将其取名为swin和sink;最终也会得到最上面的(数组的第一个)数是最大的;删除的时候,将根节点保存,并和数组的最后一个节点交换,然后返回最大值,将数组的长度减一,最后释放最后一个节点。

  实现代码:

  1. public class YouxiangDuilie{
  2. /*
  3. *通过数组实现队列的优先级
  4. *
  5. *
  6. *
  7. */
  8. //初始化数组和定义N表示数组的长度
  9. private int [] keys;
  10. private int N;
  11. /*
  12. *交换函数
  13. *
  14. */
  15. public void exch(int [] a,int i,int j){
  16. int temp = a[i];
  17. a[i] = a[j];
  18. a[j] = temp;
  19. }
  20. /*
  21. *判断大小函数
  22. *
  23. */
  24. public boolean less(int a,int b){
  25. return a[a].compareTo(a[b]) < 0;
  26. }
  27. /*
  28. *上浮函数:
  29. *如果这个数比它的上一级的数大的话,就将它两交换。
  30. *
  31. */
  32. public void swim(int k){
  33. while(k > 1&& less(k / 2,k)){
  34. exch(k / 2,k);
  35. k = k / 2;
  36. }
  37. }
  38. /*
  39. *将元素下沉
  40. *
  41. */
  42. public void sink(int k){
  43. while(K * 2 <= N){
  44. int j = k * 2;
  45. //此时下标为2*n,需要判断和它同级的数字谁小,取一个小的进行对比
  46. if(j < N && !less(j,j+1)) j++;//如果是奇数大就将索引放到奇数为
  47. if(!less(k , j)) break;
  48. exch(k,j);
  49. k = j;
  50. }
  51. }
  52. /*
  53. *实现数组的添加
  54. *
  55. */
  56. public void insert(int n ){
  57. key[++N] = n ;
  58. //处于最底层所以要将其上浮
  59. swim(N);
  60. }
  61. /*
  62. *删除元素的操作并返回
  63. *
  64. */
  65. public int delMax(){
  66. int maxax = a[1];
  67. //将最后一个和第一个交换位置;并将数组的长度减一
  68. exch(1,N--);
  69. a[N] = null;
  70. return max;
  71. }
  72. }

 

  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号