zoukankan      html  css  js  c++  java
  • 堆排序(利用最大堆)

    1. package heap;   
    2.   
    3. import java.math.BigInteger;   
    4.   
    5. /**
    6. * 最大堆最小堆性质:
    7. * 完全二叉树
    8. * left=2i;
    9. * right=2i+1;
    10. * 最大堆:除根节点外,子节点<父节点
    11. * 最小堆:除根节点外,子节点>父节点
    12. * 堆排序算法复杂度:o(n*lgn)
    13. *
    14. * @author B.Chen
    15. *
    16. */  
    17. public class MaxHeap {   
    18.   
    19.     public int heapSize;   
    20.   
    21.     public int parent(int i) {   
    22.         return i / 2;   
    23.      }   
    24.   
    25.     public int left(int i) {   
    26.         return 2 * i;   
    27.      }   
    28.   
    29.     public int right(int i) {   
    30.         return 2 * i + 1;   
    31.      }   
    32.   
    33.     public void maxHeapify(int[] a, int i) {   
    34.         int l = left(i);   
    35.         int r = right(i);   
    36.         int largest = i;   
    37.         if (l < heapSize) {   
    38.             if (a[l] > a[i]) {   
    39.                  largest = l;   
    40.              }   
    41.          }   
    42.         if (r < heapSize) {   
    43.             if (a[r] > a[largest]) {   
    44.                  largest = r;   
    45.              }   
    46.          }   
    47.         if (largest != i) {   
    48.             int temp = a[i];   
    49.              a[i] = a[largest];   
    50.              a[largest] = temp;   
    51.              maxHeapify(a, largest);   
    52.          }   
    53.      }   
    54.   
    55.     public void builtMaxHeap(int[] a) {   
    56.          heapSize = a.length;   
    57.         for (int i = (a.length - 1) / 2; i >= 0; i--) {   
    58.              maxHeapify(a, i);   
    59.          }   
    60.      }   
    61.   
    62.     public void heapSort(int[] a) {   
    63.          builtMaxHeap(a);   
    64.         for (int i = a.length - 1; i > 0; i--) {   
    65.             int temp = a[0];   
    66.              a[0] = a[i];   
    67.              a[i] = temp;   
    68.              heapSize = heapSize - 1;   
    69.              maxHeapify(a, 0);   
    70.          }   
    71.      }   
    72.   
    73.     public static void main(String[] args) {   
    74.          MaxHeap mh = new MaxHeap();   
    75.         int[] a = new int[] { 7, 6, 4, 2, 8, 3, 1, 5, 9, 0 };   
    76.          mh.heapSort(a);   
    77.         for (int i = 0; i < a.length; i++) {   
    78.              System.out.print(a[i] + " ");   
    79.          }   
    80.      }   
    81.   
    82. }  
    83. 其中2×i可以用二进制表示成i<<1
      2×i+1可以表示成(i<<1)+1
  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 完美的代价
    Java实现 蓝桥杯VIP基础练习 矩形面积交
    Java实现 蓝桥杯VIP 基础练习 完美的代价
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    核心思想:想清楚自己创业的目的(如果你没有自信提供一种更好的产品或服务,那就别做了,比如IM 电商 搜索)
    在Linux中如何利用backtrace信息解决问题
  • 原文地址:https://www.cnblogs.com/xinzhuangzi/p/4100618.html
Copyright © 2011-2022 走看看