import java.util.*;
public class HeapSort{
public static void main(String[] args) {
int [] arr = {5,9,2,1,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--) {
//从第一个非叶子结点从下岛上,从右到左调整结构
adjustHeap(arr, i, arr.length);
}
//调整堆结构,交换堆顶元素和末尾元素
for (int j = arr.length-1; j > 0; j--) {
swap(arr, 0, j);//堆顶元素和末尾元素进行交换
adjustHeap(arr, 0,j);//重新对堆进行调整
}
}
public static void adjustHeap(int [] arr,int i, int length) {
int temp = arr[i]; //保存当前值
//i*2+1 为左子节点,i*2+2为右子节点,比较他俩大小,并指向大的一方
for(int k = i*2+1; k<length;k=k*2+1) {
if (k+1<length && arr[k] < arr [k+1]) {
k++;
}
//如果子节点大于父节点,将子节点赋值给父节点(不进行交换)
if (arr[k] > temp) {
arr[i] = arr[k];
i = k;
}else {
break;
}
}
//通过不断比较,讲temp的值放到最终的位置
arr[i] = temp;
}
public static void swap(int [] arr ,int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
算法笔记--堆排序
最新推荐文章于 2024-02-27 10:54:30 发布