校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 算法 > 高级排序(快排、堆排等)
题目

堆排序的原理

解答

1、将给定数组转化为一个二叉堆

2、定义一个指针,为数组的最后一位

function sortArray (nums: number[]) {
let N = nums.length - 1
// 从中位开始, 指针i, 向左移动
for(let i = Math.floor(N / 2); i >= 0; i--) {
// 将 i 至 N 位元素堆有序直到数字组首位
sink(nums, i, N)
}
}

3、将二叉堆的根节点(最大值)与当前指针位交换, 随后指针往左挪一位

4、将数组索引0开始到指针这调用一次sink(), 重新堆有序化

function sink (nums: number[], k: number, N: number) {
while (k * 2 <= N) {
let j = k * 2 // 子节点
if (j < N && nums[j] < nums[j + 1]) j++
if (nums[k] >= nums[j]) break;
exch(nums, k, j)
k = j
}
}
function sortArray (nums: number[]) {
let N = nums.length - 1
// 从中位开始, 指针i, 向左移动
for(let i = Math.floor(N / 2); i >= 0; i--) {
// 将 i 至 N 位元素堆有序直到数字组首位
sink(nums, i, N)
}
while (N > 0) {
exch(nums, 0, N--) // 交换首位与尾部, 并且指针左移
sink(nums, 0, N) // 指针移动后向堆有序化
}
return nums
}


C 0条回复 评论

帖子还没人回复快来抢沙发