通过利用数组vector建堆
堆具体是如何调整参考此处
代码实现:
找出子节点和父节点的关系 :父节点 =(子节点-1)/ 2
然后得到子父节点
判断是否满足最大堆最小堆的条件
不满足则进行调换
#include <iostream>
#include <vector>
using namespace std;
vector<int> nums = {6, 9, 2, 4, 7, 0, 1, 8, 3, 5};
vector<int> maxheap(vector<int> nums)
{
int n = nums.size();
int idx = 0;
vector<int> temp(n, 0);
while (idx < n)
{
temp[idx] = nums[idx];
if (idx != 0)
{
int son_idx = idx;
int par_idx = (son_idx - 1) / 2;
while (temp[par_idx] < temp[son_idx])
{
swap(temp[par_idx], temp[son_idx]);
son_idx = par_idx;
par_idx = (son_idx - 1) / 2;
}
}
idx++;
}
return temp;
}
vector<int> minheap(vector<int> nums)
{
int n = nums.size();
int idx = 0;
vector<int> temp(n, 0);
while (idx < n)
{
temp[idx] = nums[idx];
if (idx != 0)
{
int son_idx = idx;
int par_idx = (son_idx - 1) / 2;
while (temp[par_idx] > temp[son_idx])
{
swap(temp[par_idx], temp[son_idx]);
son_idx = par_idx;
par_idx = (son_idx - 1) / 2;
}
}
idx++;
}
return temp;
}
int main()
{
vector<int> res1 = maxheap(nums);
vector<int> res2 = minheap(nums);
cout << "最大堆:" << endl;
for (int num : res1)
{
cout << num << " ";
}
cout << endl;
cout << "最小堆:" << endl;
for (int num : res2)
{
cout << num << " ";
}
cout << endl;
return 0;
}
堆排序:
堆排序的基本思想:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。
将其与末尾元素进行交换,此时末尾就是最大值。
然后将剩下的n-1元素重新构造成一个堆,这样会得到n个元素的次小值。
如此反复,便能得到一个有序序列了。
参考一
参考二
代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void max_heapify(vector<int> &nums, int start, int end)
{
int dad = start;
int son = dad * 2 + 1;
while (son <= end)
{
if (son + 1 <= end && nums[son] < nums[son + 1])
{
son++;
}
if (nums[dad] > nums[son])
{
return;
}
else
{
swap(nums[dad], nums[son]);
dad = son;
son = dad * 2 + 1;
}
}
}
void heap_sort(vector<int> &nums, int len)
{
for (int i = len / 2 - 1; i >= 0; i--)
{
max_heapify(nums, i, len - 1);
}
for (int i = len - 1; i > 0; i--)
{
swap(nums[0], nums[i]);
max_heapify(nums, 0, i - 1);
}
}
int main()
{
vector<int> nums = {3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4};
heap_sort(nums, nums.size());
for (int num : nums)
{
cout << num << " ";
}
cout << endl;
return 0;
}