c++堆排序

Posted 每天告诉自己要努力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++堆排序相关的知识,希望对你有一定的参考价值。

快排和归并排序点这里

堆排序跟快排一样是原地操作的一种不稳定排序算法。
堆排序分为建堆和调整堆。建堆是通过父节点和子节点两两比较并交换得到的,时间复杂度为O(n),调整堆需要交换n-1次堆顶元素,并调整堆,调整堆的过程就是满二叉树的深度logn,所以时间复杂度为O(nlogn),所以最终时间复杂度为O(nlogn)。

每次都是只操作一个数据,没有额外的辅助空间,空间复杂度为O(1)。

#include <iostream>
#include <vector>
using namespace std;

void headipy(vector<int>& nums, int len, int i) 
	int l = i * 2 + 1, r = i * 2 + 2;
	int max = i;
	if (l < len && nums[l] > nums[max]) max = l;
	if (r < len && nums[r] > nums[max]) max = r;
	if (max != i) 
		swap(nums[max], nums[i]);
		heapify(nums, len, max);
	


void heapSort(vector<int>& nums, int len) 
	//建堆
	int lastIndex = len - 1;
	int lastParent = (lastIndex - 1) / 2;
	for (int i = lastParent; i >= 0; i--) 
		heapify(nums, len, i);
	
	
	//排序
	for (int i = lastIndex; i >= 0; i--) 
		swap(nums[i], nums[0]);
		heapify(nums, i, 0);
	


int main() 
	vector<int> nums5, 4, 3, 2, 1;
	heapSort(nums, nums.size());
	for (auto x : nums) cout << x << " ";
	cout << endl;
	return 0;

以上是关于c++堆排序的主要内容,如果未能解决你的问题,请参考以下文章

堆排序算法的C++实现

堆排序算法的C++实现

c++ 手写堆 (包括建堆排序添加元素删除元素)

原地堆排序

挖掘算法中的数据结构:堆排序之 二叉堆(Heapify原地堆排序优化)

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)