算法导论-MaxHeap问题(全)最大堆

    技术2022-05-19  38

    public class MaxHeap {  public static void main(String args[]) {   new MaxHeap();  }  private int MaxHeapSize;  public MaxHeap(){   int[] data = { 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37,     36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21,     20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4,     3, 2, 1, -1 ,-1};   // System.out.println(5/2);   // int[] data = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, };   MaxHeapSize=data.length-1;   revise(data);   print(data);   // System.out.println((int) (Math.log(data.length) / Math.log(2)));   // System.out.println(Math.pow(2, 2)); //  maxHeapify(data, 10);   buildHeap(data); //  heapSort(data); //  System.out.println(HeapExtractMax(data)); //  heapIncreaseKey(data,30,66);   MaxHeapInsert(data,77);   print(data);  }  /*public static void print3(int[] data) {   for (int i = 0; i < data.length / 2 + 2; i++)    System.out.print("  ");   for (int i = 1, j = 1; i < data.length; i++) {    System.out.print(data[i] + " ");    if (data[i] < 10) {     System.out.print("  ");    } else {     System.out.print(" ");    }    if (i == j) {     System.out.println();     j = 2 * j + 1;     for (int v = data.length / 2 - i; v >= 0; v--) {      System.out.print("  ");     }    }   }   System.out.println();  }

     public static void print2(int[] data) {   int i, n1, n2;   int height = (int) (Math.log(data.length) / Math.log(2));   int width = (int) Math.pow(2, height);   boolean firstOneOfLine = true;   for (i = 1, n1 = 1, n2 = 1; i < data.length; i++) {         * if (i == n1) { for (int v = 1; v < Math.pow(2, height); v++) {     * System.out.print("  "); } height--; n1 = n1 * 2; }        if (firstOneOfLine) {     for (int v = 1; v < width; v++) {      System.out.print("    ");     }     firstOneOfLine = false;    } else {     for (int v = 1; v < width * 2; v++) {      System.out.print("     ");     }    }

       System.out.print(data[i] + "  ");    if (data[i] < 10) {     System.out.print("  ");    } else {     System.out.print(" ");    }

       if (i == n2) {     System.out.println();     System.out.println();     System.out.println();     n2 = 2 * n2 + 1;     width = width / 2;     firstOneOfLine = true;    }   }  }*/

     public static void print(int[] data) {   int i, n1, n2;   int height = (int) (Math.log(data.length) / Math.log(2));   int width = (int) Math.pow(2, height);   boolean firstOneOfLine = true;   for (i = 1, n1 = 1, n2 = 1; i < data.length; i++) {    /*     * if (i == n1) { for (int v = 1; v < Math.pow(2, height); v++) {     * System.out.print("  "); } height--; n1 = n1 * 2; }     */    if (firstOneOfLine) {     for (int v = 1; v < width; v++) {      System.out.print("  ");     }     firstOneOfLine = false;    } else {     for (int v = 1; v < width * 2; v++) {      System.out.print("   ");     }    }

       System.out.print(data[i]);    if (data[i] < 10) {     System.out.print("  ");    } else {     System.out.print(" ");    }

       if (i == n2) {     System.out.println();     n2 = 2 * n2 + 1;     width = width / 2;     firstOneOfLine = true;    }   }   System.out.println();  }

     public void maxHeapify(int[] A, int i) {   int l = 2 * i;   int r = 2 * i + 1;   int large = i;   int temp;   if (l < MaxHeapSize && A[i] < A[l]) {    large = l;   } else {    large = i;   }   if (r < MaxHeapSize && A[large] < A[r]) {    large = r;   }   if (large != i) {    temp = A[i];    A[i] = A[large];    A[large] = temp;    maxHeapify(A, large);   }  }

     public void revise(int[] A) {   int temp;   for (int i = 0; i <= MaxHeapSize / 2; i++) {    temp = A[i];    A[i] = A[MaxHeapSize - i - 1];    A[MaxHeapSize - i - 1] = temp;   }  }

     public void buildHeap(int[] A) {   for (int i = A[A.length / 2]; i >= 1; i--) {    maxHeapify(A, i);   }  }  public void heapSort(int[] A){   int temp;   buildHeap(A);   for(int i=A.length-1;i>=1;i--){    temp=A[1];    A[1]=A[i];    A[i]=temp;    MaxHeapSize--;    maxHeapify(A,1);   }  }  public int HeapExtractMax(int[] A){   int max;   if(MaxHeapSize<1){    return -1;   }   max=A[1];   MaxHeapSize--;   A[1]=A[MaxHeapSize];   maxHeapify(A,1);   return max;  }  public void heapIncreaseKey(int[] A,int i,int key){   int temp;   if(key<A[i])    return;   A[i]=key;   while(A[i/2]<A[i] && i>1){    temp=A[i/2];    A[i/2]=A[i];    A[i]=temp;    i=i/2;   }  }  public void MaxHeapInsert(int[] A,int key){   MaxHeapSize++;   A[MaxHeapSize-1]=-1;   heapIncreaseKey(A,MaxHeapSize-1,key);  } }


    最新回复(0)