大顶堆的简单实现(java)


堆的实现主要有两点:

(1)建堆,将一个无序序列建成一个堆。

(2)在输出堆顶元素之后,调整剩余元素成为一个新的堆。

  这两个过程主要做了同一件事情,就是堆的调整,即将当前节点与其左右子节点进行比较,选出最大的元素值并与当前节点值交换(若当前节点最大,则不用交换)。

   具体代码实现:

[java]  view plain  copy
  1. //java 大顶堆的简单实现  
  2. import java.util.Arrays;  
  3. public class Heap{  
  4.     public void heapSort(int[] num){  
  5.         int n = num.length;  
  6.         for(int i = n/2;i>=0;i--){   //建堆,从n/2开始向上调整(减不减1好像没关系)  
  7.             adjustHeap(num, i, n);  
  8.         }  
  9.         for(int j=n-1;j>=0;j--){  
  10.             swap(num,0, j);         //交换开始和最后位置上的数字  
  11.             adjustHeap(num, 0, j);    //交换之后再调整堆,共用一个调整堆的函数(厉害)  
  12.         }  
  13.     }  
  14.     public void adjustHeap(int[] num,int s,int n){  //由于根节点编号是从0开始的,所以其左子树是2*i+1  
  15.         for(int i=s;i<n;){  //这个不能丢,保证全局调整而不是局部调整
  16.             int max = i;  
  17.             if((2*i+1)<n&&num[2*i+1]>num[max]) max = 2*i+1;  
  18.             if((2*i+2)<n&&num[2*i+2]>num[max]) max = 2*i+2;  
  19.             if(max!=i){  
  20.                 swap(num,i,max);     
  21.                 i=max;  
  22.             }else break;  
  23.               
  24.         }  
  25.           
  26.     }  
  27.     public void swap(int[] num,int i,int j){  
  28.         int tem = num[i];  
  29.         num[i] = num[j];  
  30.         num[j] = tem;  
  31.     }  
  32.      public static void main(String[] args) {  
  33.         Heap heap = new Heap();  
  34.         int[] num = new int[]{49,38,65,97,76,13,27,49};  
  35.         heap.heapSort(num);  
  36.         System.out.println(Arrays.toString(num));  
  37.     }  
  38. }  
想到用同一个调整堆的函数,将堆排序的代码精简到如此,比较容易理解,更重要的是可以快速清晰的看出算法的结构,
写代码就要这样,记忆代码也要尽量简洁。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值