1·小铺垫
首先我们需要了解两个词,大顶堆,小顶堆,我们借用个图来表示
大顶堆的节点会比自己的子节点要大,小顶堆的节点要比自己的子节点要小;
用表达式就是:
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
2·堆排序讲解
我们主要是利用了大顶堆升序排列了数组,排序过程只需要干两件事情:
1·构建大顶堆
2·将堆顶元素和数组末尾元素交换
代码实现:
import java.util.Arrays;
/**堆排序
* @author JYT
* @date 2021年08月16日 23:17
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = new int[]{1,4,2,22,3,5};
heap(arr);
}
public static void heap(int[] arr ){
for(int i=arr.length/2-1;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
//堆顶元素和数组末尾元素进行互换位置
for(int j=arr.length-1;j>0;j--){
int temp = arr[0];
arr[0] = arr[j] ;
arr[j] = temp;
//继续从上到下构建大顶堆
adjustHeap(arr,0,j);
}
System.out.println(Arrays.toString(arr));
}
//构造大顶堆
public static void adjustHeap(int[] arr ,int parent,int length){
int temp = arr[parent];
int lChild = 2*parent + 1 ;
while(lChild<length){
int rChild = lChild + 1;
if(rChild<length && arr[rChild]>arr[lChild]){
lChild++;
}
if(temp>arr[lChild]){
break;
}
//把孩子的值给父亲节点
arr[parent] = arr[lChild] ;
//把孩子的索引给父亲节点 便于向下继续筛选;
parent = lChild ;
//孩子的节点继续向下探索
lChild = 2*lChild +1 ;
}
//把原来父亲节点的值给到现在父亲节点的值,也就是向下传递了
arr[parent] = temp ;
}
}