实现的是大根堆
代码如下:
public static int[] heapSort(int[] A, int n) {
//先建立一个大根堆
A=getDui(A);
//进行一个个的排序拖出从根顶开始
for(int i=n-1;i>0;i--){
int t=A[0];
A[0]=A[i];
A[i]=t;
//每次从根底取值然后长度-1然后进行大根堆的化简
adjustHead(A, 0, i);
}
return A;
}
public static int[] getDui(int[] A){
for(int i=A.length/2;i>=0;i--){
adjustHead(A,i,A.length);
//每一个i都是根节点的值
}
return A;
}
public static void adjustHead(int[] A,int k,int n){
int tem=A[k];//每次保留根节点
for(int i=2*k+1;i<n;i=2*i+1){//此时i表示的是当前根节点k下的左结点
if(i!=n-1 && A[i]<A[i+1]){
i++;//根节点下面的左结点比右节点小,则i就要+1;
}
if(tem>A[i]){//这里是判断根节点和下面的左结点或者右节点进行比较
break;
}else{//如果根不大于的话则又要进行下一层的比较
A[k]=A[i];
//所以这里有
k=i;//再进行k=i作为根节点的一层,当然i和k都小于长度n
}
}
A[k]=tem;
}