直接将数组调整成最大或者最小堆
@heapsort
begin():
1.将数组转成堆heapify();
2.移出根结点的值,然后把最后一个元素移动到根节点处;
3.while(len>0)
调整堆heapify();
转2;
end();
堆化算法:最小堆
void heapify(vector<int> arr) {
int len = arr.size();
for (int k = (len - 1) / 2; k >= 0; k--) //从距离叶子最近的节点开始
{
while (k * 2 + 1 < len)
{
int son = k * 2 + 1; // A[i] 的左儿子下标
if (k * 2 + 2 < len&& arr[son] > arr[k * 2 + 2]) {//如果有右儿子子并且左儿子大于右耳子
son = k * 2 + 2; // 选择两个儿子中较小的
}
if (arr[son] > arr[k]) {
break;
}//左右儿子都大于父节点,退出while循环,否则交换
int temp = arr[son];
arr[son] = arr[k];
arr[k] = temp;
k = son;//调换之后,son作为父节点的情况
}
}
}
网友评论