热点面试题-堆排序

堆排序:

* 大顶堆:根节点的值大于左右孩子的值,排序结果是 从小到大

* 小顶堆:根节点的值小于左右孩子的值,排序结果是 从大到小

注意:

堆是一个完全二叉树

【1】选择倒数第二排的节点     进行  堆的初始化:  大顶堆  or  小顶堆;

【2】完成初始化后,交换顶点与末尾节点;

【3】交换完后,进行  堆类型    的重构;

【4】重构 后,再交换顶点与末尾节点;

【5】再重构;

...

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int>ans;

void bigheap(vector<int>&nums, int start,int end) {
	int parent = start;
	int child = 2 * parent + 1;
	while (child < end) {
		//判断左右节点哪个大于父节点
		if (child + 1 < end && nums[child + 1] > nums[child])
			child++;
		//扎到了大于父节点的子节点后,交换两个节点的值
		if (nums[parent] < nums[child]) {
			swap(nums[parent], nums[child]);
			parent = child;//子节点的下标给父节点
		}
		//更新子节点
		child = 2 * child + 1;
	}
}
void heapSort(vector<int>&nums) {
	int n = nums.size();
	if (n <= 1)return;
	//从倒数第二排开始创建大顶堆
	for (int i = n / 2-1; i >= 0; i--)bigheap(nums, i,n);
	for (int j = n - 1; j > 0;j--) {
		//交换顶点和第 j 个数据
		swap(nums[0], nums[j]);
		//每交换一次重新建立大顶堆
		bigheap(nums, 0,j);
	}
}
int main() {
	vector<int>nums(9);
	for (int i = 0; i < 9; i++) {
		cin >> nums[i];
	}
	heapSort(nums);
	for (auto num : nums)
		cout << num << " ";
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值