Exemple #1
0
 /**
  * 建堆
  *
  * @param data
  */
 private static void buildMaxHeap(int[] data) {
   // 没有子节点的才需要创建最大堆,从最后一个的父节点开始
   int startIndex = getParentIndex(data.length - 1);
   // 从尾端开始创建最大堆,每次都是正确的堆
   for (int i = startIndex; i >= 0; i--) {
     maxHeap(data, data.length, i);
   }
 }
Exemple #2
0
 /**
  * 排序,最大值放在末尾,data虽然是最大堆,在排序后就成了递增的
  *
  * @param data
  */
 private static void heapSort(int[] data) {
   // 末尾与头交换,交换后调整最大堆
   for (int i = data.length - 1; i > 0; i--) {
     int temp = data[0];
     data[0] = data[i];
     data[i] = temp;
     maxHeap(data, i, 0);
   }
 }
Exemple #3
0
  /**
   * 维护堆的性质
   *
   * @param data
   * @param heapSize 需要创建最大堆的大小,一般在sort的时候用到,因为最多值放在末尾,末尾就不再归入最大堆了
   * @param index 当前需要创建最大堆的位置
   */
  private static void maxHeap(int[] data, int heapSize, int index) {
    // 当前点与左右子节点比较
    int left = getChildLeftIndex(index);
    int right = getChildRightIndex(index);

    int largest = index;
    if (left < heapSize && data[index] < data[left]) {
      largest = left;
    }
    if (right < heapSize && data[largest] < data[right]) {
      largest = right;
    }
    // 得到最大值后可能需要交换,如果交换了,其子节点可能就不是最大堆了,需要重新调整
    if (largest != index) {
      exchange(data, index, largest);
      maxHeap(data, heapSize, largest);
    }
  }