面试常见算法之堆排序

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
int heap_size;

void heapify(vector<int> &nums, int i)
{
	// 检查节点i的子孩子是否大于节点i
	int left = 2 * i + 1;
	int right = 2 * i + 2;
	int largest = i;
	if (left < heap_size && nums[left] > nums[largest])
		largest = left;
	if (right < heap_size && nums[right] > nums[largest])
		largest = right;
	// 如果子孩子大于节点i
	// 需要进行交换
	// 并对子孩子进行递归的heapify
	if (largest != i) {
		swap(nums[i], nums[largest]);
		heapify(nums, largest);
	}
}

void heap_sort(vector<int>& nums) {
	heap_size = nums.size();
	// 从倒数第二层的第一个节点开始,向上一层层构建最大堆
	for (int i = heap_size / 2; i >= 0; --i) {
		heapify(nums, i);
	}
	// 将最大堆根节点(最大元素)与最大堆最后一个元素交换
	// 将最大堆长度-1
	// 重新构建最大堆
	// 最后得到排序数组
	for (int i = nums.size() - 1; i > 0; --i) {
		swap(nums[0], nums[i]);
		--heap_size;
		heapify(nums, 0);
	}
}

int main()
{
	vector<int> nums = { 6,2,4,3,1,0,9,7,3,5,3,1};
	heap_sort(nums);
	for (int num : nums)
		cout << num;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值