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++堆排序的主要内容,如果未能解决你的问题,请参考以下文章