以“从小到大”排序为例:
1.建立大根堆
2.每次和堆顶元素进行交换 [swap ( top , end )]
3. 直到全部交换完成
总结:大根堆+交换+调整
public class Sort{
/**
* 堆排
* 时间复杂度 0(N*logN)
* @param args
*/
private static void HeapSort(int[] arr){
//创建一个大根堆
createBigHeap(arr);
int end=arr.length-1;
while(end>=0){
//堆顶每次和最后一个交换
swap(arr,0,end);
end--;
//重新调整为大根堆
shiftDown(arr,0,end);
}
}
//创建一个大根堆
private static void createBigHeap(int[] arr){
int end=arr.length-1;
int parent=(end-1)/2;
//调整每一颗树,使成为大根堆
for(;parent>=0;parent--){
shiftDown(arr,parent,end);
}
}
//向下调整
private static void shiftDown(int[] arr,int parent,int end){
//end是左子树还是右子树?是否有右子树? / 左子树大还是右子树大?
int left=parent*2+1;
while(left<=end){
int right=parent*2+2;
//node存储可能需要和parent交换的子树下标
int node=left;
//左子树大还是右子树大?
if(right<=end && arr[left]<arr[right]){
node=right;
}
//子树比parent大
if(node<=end && arr[parent]<arr[node]){
swap(arr,parent,node);
}
//迭代
parent=node;
left=parent*2+1;
}
}
//交换
private static void swap(int[] arr,int top,int end){
int tmp=arr[end];
arr[top]=arr[end];
arr[end]=tmp;
}
}