一、解题思路
1.利用完全二叉树构建大顶堆
2.堆顶和堆底元素进行互换,除了堆底元素之外其余元素继续构建大顶堆
3.不断重复2,直到数据全部不再参与大顶堆,排序完成
二、相关术语
完全二叉树:数据从上到下从左到右依次排列
大顶堆:所有节点都是父节点的值大于等于左右孩子的值(最多一个父亲,孩子可多个) 最大的值是根节点
Arr[i]的左孩子arr[2i+1]
Arr[i]的右孩子arr[2i+2]
Arr[i]的父节点arr[(i-1)/2]
构建条件:arr[i]>=arr[2i+1]&&Arr[i]>=arr[2i+2]
三、如何构建大顶堆:
定义游标从后往前检测所有节点
1.定义parent游标指向要检测的节点
2.定义parent的左孩子child,判断有无左孩子(有孩子一定有左孩子)
3.如果没有左孩子,则parent指向的节点符合大顶堆,继续向前检测
4.如果有左孩子,判断有无右孩子,child指向左右孩子最大值
5.判断parent和child的值进行比较,如果parent的值大,继续向前检测
6.如果parent指向的值小,父子节点进行交换,交换完成之后parent指向child,child继续指向左右孩子的最大值,继续比较,直到child为空或者parent指向的值大
四、Java代码
import java.util.Arrays;
//堆排序
public class dui {
public static void main(String[] args) {
int[] arr =new int[] {10,5,2,8,4,6};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr) {
for(int i=arr.length/2-1;i>=0;i--) {
adjust(arr,i,arr.length);
}
for(int i=arr.length-1;i>=0;i--) {
int temp =arr[i];
arr[i]=arr[0];
arr[0]=temp;
adjust(arr,0,i);
}
}
public static void adjust(int[] arr,int parent,int length) {
int child =2*parent+1;
while(child<length) {
int rchild=child+1;
if(rchild<length && arr[child]<arr[rchild]) {
child=rchild;
}
if(arr[parent]<arr[child]) {
int temp=arr[parent];
arr[parent]=arr[child];
arr[child]=temp;
parent=child;
child=2*parent+1;
}else {
break;
}
}
}
}
994

被折叠的 条评论
为什么被折叠?



