堆排序-java

public class 堆排序 {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
     int []A = {0,5,2,3,6,5,4,7,8,9};
     HEAPSORT(A);
     System.out.println("排序結果爲");
     //for(int i:A){
     for (int i = 1; i < A.length;i++){
      System.out.print(A[i]+"  ");
     }
 }
 public static void MAX_HEAPIFY(int A[],int i){//維護堆 的性質
  int l,r;//記錄當前節點左右子節點在數組中的位置
  int largest;//記錄最大節點位置
  l = LEFT(i);//獲取當前節點左子節點在數組中的位置
  r = RIGHT(i);
  if(l <= A[0] && A[l] > A[i]){//A[0]用於記錄數組中屬於堆得元素個數
   largest = l;
  }
  else largest = i;
  if(r <= A[0] && A[r] > A[largest]){
   largest = r;
  }
  if(i != largest){
   int ex;
   ex = A[i];
   A[i] = A[largest];
   A[largest] = ex;
   MAX_HEAPIFY(A,largest);
  }
 }
 
 public  static int LEFT(int i){
  return 2*i;
 }
 
 public static  int RIGHT(int i){
  return 2*i + 1;
 }
 
 public static void BUILD_MAX_HEAP(int A[]){//建堆
  A[0] = A.length - 1;//A[0]存儲數組中屬於堆中的元素
  for( int i = (A.length)/2; i>=1;i--){
   MAX_HEAPIFY(A,i);
  }
 }
 
 public static void HEAPSORT(int A[]){//排序
  BUILD_MAX_HEAP(A);
  for(int i = A.length - 1; i>1;i--){
   int ex;
   ex = A[i];
   A[i] = A[1];
   A[1] = ex;
   A[0] -=1;
   MAX_HEAPIFY(A,1);
  }
 }
 
}
/ **************
時間複雜度O(nlgn)

堆的一些性質

1.含有Ñ個元素的堆的高度爲lgn(向下取整)

2.當數組表示存儲N個元素的堆時,葉結點的下標爲int(n/2) +1,int(n/2) +2 ........n

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章