面试常见算法之堆排序

#include 
#include 
#include 

using namespace std;
int heap_size;

void heapify(vector &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& 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 nums = { 6,2,4,3,1,0,9,7,3,5,3,1};
	heap_sort(nums);
	for (int num : nums)
		cout << num;
}

 

你可能感兴趣的:(算法)