class Solution {
public int[] sortArray(int[] nums) {
int n = nums.length;
// 创建一个完全二叉树(这样就可以使用数组的表示来表示堆了!)
buildHeap(nums,n);
for(int i = n - 1; i >= 0; i--){
// 头结点元素与最末端元素进行交换
swap(nums, i, 0);
// heapfiy交换操作,为当前无序的头结点元素再次进行排序
heapfiy(nums, i ,0);
}
return nums;
}
// 数组交换
public static void swap(int[] nums, int i, int max){
int temp = nums[i];
nums[i] = nums[max];
nums[max] = temp;
}
// heapfiy操作,将一个子堆中的最大元素放入堆头,保持完全二叉树结构
// n:堆的长度 i:为当前结点
public static void heapfiy(int[] nums, int n, int i){
if(i >= n){
return;
}
int leftCh = 2 * i + 1; // 当前结点的左孩子
int rightCh = 2 * i + 2; // 当前结点的右孩子
int max = i;
// 当左孩子较大时
if(leftCh < n && nums[leftCh] > nums[max]){
max = leftCh;
}
// 当右孩子较大时
if(rightCh < n && nums[rightCh] > nums[max]){
max = rightCh;
}
// 交换
if(max != i){
swap(nums,i, max);
// heapfiy交换操作,不过这里是递归调用
heapfiy(nums, n, max);
}
}
// 构建一个完全二叉树
public static void buildHeap(int[] nums, int n){
int lastNode = n - 1; // 末结点
int parent = (lastNode - 1) / 2; // 倒数第二层的父节点
for(int i = parent; i >= 0; i--){
heapfiy(nums, n, i);
}
}
}
heapLearnIng
最新推荐文章于 2024-08-22 17:27:46 发布