// my_heap.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<vector>
#include<iostream>
using namespace std;
void print_heap(vector<int>intv)
{
size_t size = intv.size();
size_t i=0;
while (i < size)
{
int j = i;
for (; j <= 2 * i&&j<size; j++)
cout << intv[j]<<" ";
cout << endl;
i=j;
}
}
//max_heap操作
void my_push_heap(vector<int> &nums, int value)
{
nums.push_back(value);
int holdindex = nums.size() - 1;
int parent = (holdindex - 1) / 2;
while (nums[parent] < value && holdindex >0)
{
nums[holdindex] = nums[parent];
holdindex = parent;
parent = (holdindex - 1) / 2;
}
nums[holdindex] = value;
}
void my_pop_heap(vector<int> &intv)//把第一个结点去除
{
int value = intv[0];
int holeIndex = 0;
int secondChild = 2 * holeIndex + 2; //右子树
int size = intv.size();
/*intv[0] = intv[size-1];
intv[size-1] = value;*/
int value1 = intv[size-1];
while (secondChild < size)
{
if (intv[secondChild] < intv[secondChild - 1]) //如果左子树大,secondChild指向左子树
secondChild--;
intv[holeIndex] = intv[secondChild];
holeIndex = secondChild;
secondChild = 2 * holeIndex + 2;
}
if (secondChild == size)
{
intv[holeIndex] = intv[secondChild-1];
holeIndex = secondChild - 1;
}
else
{
intv[holeIndex] = value1;
}
//intv[holeIndex] = value;
intv[size - 1] = value;
}
void my_sort_heap(vector<int>&nums, vector<int>&result)
{
//vector<int>result;
//int i = 0;
while ( nums.size()>0)
{
my_pop_heap(nums);
int v = nums.back();
result.push_back(v);
nums.pop_back();
//i++;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int>nums = { 68, 31, 65, 21, 24, 32, 26, 19, 16, 13 };
print_heap(nums);
int value;
cout << "请输入要插入的元素:";
cin >> value;
my_push_heap(nums, value);
print_heap(nums);
cout << endl;
cout << "去除最大元素" << endl;
my_pop_heap(nums);
print_heap(nums);
cout << endl;
nums.pop_back();
cout << "排序后" << endl;
vector<int>r;
my_sort_heap(nums,r);
print_heap(r);
cout << endl;
system("pause");
return 0;
}
STL中heap学习
最新推荐文章于 2024-12-25 21:53:40 发布