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);
}
}
}
// 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