c++堆排序-建堆-插入-删除-排序

本文以大根堆为例,用数组实现,它的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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值