package sort;
import java.util.Arrays;
public class HeapSort {
public static void sort(int []arr){
//1.构建大顶堆
for(int i=arr.length/2-1;i>=0;i--){
//从第一个非叶子结点从下至上,从右至左调整结构
adjustHeap(arr,i,arr.length);
}
//2.调整堆结构+交换堆顶元素与末尾元素
for(int j=arr.length-1;j>0;j--){
int temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
adjustHeap(arr,0,j);//重新对堆进行调整
}
}
/**
* 调整大顶堆
* @param arr
* @param i
* @param length
*/
public static void adjustHeap(int []arr,int i,int length){
//int temp = arr[i];//先取出当前元素i
while(i * 2 + 1 < length){ //如果存在左孩子
int child = i * 2 + 1;
if(child + 1 < length && arr[child] < arr[child + 1]){
child ++; //如果右孩子大,指向右孩子
}
//如果孩子比父亲大,交换
if(arr[child] > arr[i]){
int temp = arr[i];
arr[i] = arr[child];
arr[child] = temp;
i = child; //并且i指向当前节点(因为交换后可能导致子树不满足最大堆,需要继续)
}else{
break;
}
}
}
public static void main(String []args){
int arr[] = {5,-1,6,4,2,8,-5,7,6,5,100,0,-8,-1};
sort(arr);
System.out.println(Arrays.toString(arr));
}
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布