堆排序-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

猜你喜欢

转载自blog.csdn.net/qq_41484460/article/details/80199545