堆排序是简单选择排序的一种优化,其时间复杂度为O(NLOGN)。堆排序分为建堆过程和排序过程。建堆就是建立一个大根堆(所有非终端节点的值都大于其左右节点的值)或者是小根堆。然后排序就是将堆顶元素和最后一个元素交换,并输出堆顶元素。
public class HeapSort {
public int[] heapSort(int[] A, int n) {
//1,建立大根堆
A=buildMaxHap(A);
//2,调整排序
for(int i=n-1;i>0;i--){
//堆顶和堆底元素交换
int tem=A[0];
A[0]=A[i];
A[i]=tem;
adjustHeap(A, 0, i);//将剩余的元素整理成堆
}
return A;
}
private static int[] buildMaxHap(int[] A) {
for(int i=A.length/2;i>=0;i--){
adjustHeap(A,i,A.length);
}
return A;
}
//堆的调整:将元素A[k]自下往上逐步调整树形结构
private static void adjustHeap(int[] A, int k, int len) {
int tem=A[k];
for(int i=2*k+1;i<len;i=2*i+1){
if(i!=len-1 && A[i]<A[i+1]){
i++;//右>左,取右
}
if(tem>A[i]){
break;//根>右,结束
}else{
//否则,改变根植,并继续向下调整
A[k]=A[i];
k=i;//【关键】修改k值,以便继续向下调整
}
}
A[k]=tem; //被调整的结点的值放入最终位置
}
}