算法-----堆排序

  1. package com.eshore.sweetop.sort;
  2. import java.util.Arrays;
  3. public class Heap {
  4.     private static int parent(int i) {
  5.         return (i-1) >> 1;
  6.     }
  7.     private static int left(int i) {
  8.         return i << 1|1;
  9.     }
  10.     private static int right(int i) {
  11.         return (i+1) << 1;
  12.     }
  13.     
  14.     private static int heapSize(int[] a, int i) {
  15.         if(left(i)>=a.length){
  16.             return 1;
  17.         }
  18.         if(right(i)>=a.length){
  19.             return 2;
  20.         }
  21.         return heapSize(a,left(i))+heapSize(a,right(i))+1;
  22.     }
  23.     private static void maxHeapify(int[] a, int i,int size) {
  24.         int l = left(i);
  25.         int r = right(i);
  26.         int largest = -1;
  27.         if (l < size && a[l] > a[i]) {
  28.             largest = l;
  29.         } else {
  30.             largest = i;
  31.         }
  32.         if (r < size && a[r] > a[largest]) {
  33.             largest = r;
  34.         }
  35.         if (largest != i) {
  36.             a[i] ^= a[largest];
  37.             a[largest] ^= a[i];
  38.             a[i] ^= a[largest];
  39.             maxHeapify(a, largest,size);
  40.         }
  41.     }
  42.     
  43.     public static void sort(int[] a){
  44.         buildMaxHeap(a);
  45.         
  46.         int size=a.length;
  47.         for(int i=a.length-1;i>0;i--){
  48.             a[0]^=a[i];
  49.             a[i]^=a[0];
  50.             a[0]^=a[i];
  51.             size--;
  52.             maxHeapify(a,0,size);
  53.         }
  54.     }
  55.     
  56.     public static void buildMaxHeap(int[] a){
  57.         for(int i=a.length/2-1;i>-1;i--){
  58.             maxHeapify(a,i,a.length);
  59.         }
  60.     }
  61.     
  62.     public static void main(String[] args) {
  63.         int[] a={4,1,3,2,16,9,10,14,8,7};
  64.         sort(a);
  65.         System.out.println(Arrays.toString(a));
  66.     }
  67. }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值