本文以大根堆为例,用数组实现,它的nums[0]是数组最大值。
时间复杂度分析:
建堆o(n)
插入删除o(logn)
堆排序O(nlogn)
首先上代码
#include<bits/stdc++.h>
using namespace std;
void down(vector<int>&nums, int idx, int n)
{
//删除时和由数组创建堆时用到
int leftidx = 2 * idx + 1;
int rightidx = 2 * idx + 2;
if (leftidx >= n && rightidx >= n)
return;
if (rightidx >= n && nums[idx] >= nums[leftidx])
return;
if (rightidx < n&&nums[idx] >= nums[leftidx] && nums[idx] >= nums[rightidx])
return;
if (rightidx >= n || nums[leftidx] >= nums[rightidx])
{
swap(nums[idx], nums[leftidx]);
down(nums, leftidx, n);
}
else
{
swap(nums[idx], nums[rightidx]);
down(nums, rightidx, n);
}
}
void up(vector<int>&nums, int idx)
{
//上滤操作由插入元素时用到,此处使用vector动态数组,不考虑静态数组插入元素过多导致过界拷贝扩容问题。
int faridx