public class heapSort {
public static void main(String[] args) {
int[] nums = {53,86,12,47,63,92,15,8};
heapBuild(nums,nums.length); // 建立大根堆
for (int i = 0; i < nums.length; i++) {
swap(nums,0,nums.length-i-1); // 将第一个元素(最大元素)与最后一个元素交换
heapBuilfy(nums,0,nums.length-i-1); // 重新堆化
}
}
// 以数组nums为基准建立一个大根堆,size为从下标0开始的个数
public static void heapBuild(int[] nums,int size){
for (int i = size/2; i >= 0; i--) {
heapBuilfy(nums,i,size);
}
}
// 堆化,index为要处理的数的下标,size表示长度
public static void heapBuilfy(int[] nums,int index,int size){
int left = index * 2 + 1; // 左节点
int right = index * 2 + 2; // 右节点
int max = index; // 用于记录值最大的节点,初始赋值为index
if(left < size && nums[left] > nums[max]){ // 左节点大于根节点,用max记录
max = left;
}
if(right < size && nums[right] > nums[max]){ // 右节点大于根节点,用max记录
max = right;
}
if(index != max){ // 交换过节点,递归下一层
swap(nums,max,index);
heapBuilfy(nums,max,size);
}
}
// 交换,交换nums数组的下标为a和b的元素
public static void swap(int[] nums,int a,int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}