漫画算法笔记
二叉堆基本操作
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;
template<typename T>
void upAdjust(vector<T> &vec)
{
int childIndex = vec.size() - 1;
int parentIndex = (childIndex - 1) / 2;
T temp = vec[childIndex];
while (childIndex > 0 && temp < vec[parentIndex])
{
vec[childIndex] = vec[parentIndex];
childIndex = parentIndex;
parentIndex = (childIndex - 1) / 2;
}
vec[childIndex] = temp;
}
template<typename T>
void downAdjust(vector<T> &vec, int parentIndex)
{
T temp = vec[parentIndex];
int childIndex = 2 * parentIndex + 1;
while( childIndex < vec.size() )
{
if ( childIndex + 1 < vec.size() && vec[childIndex + 1] < vec[childIndex] )
{
childIndex++;
}
if (temp <= vec[childIndex])
break;
vec[parentIndex] = vec[childIndex];
parentIndex = childIndex;
childIndex = 2 * childIndex + 1;
}
vec[parentIndex] = temp;
}
void test01()
{
vector<int> vec = {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
upAdjust(vec);
}
void test02()
{
vector<int> vec = {7, 1, 3, 10, 5, 2, 8, 9, 6};
for ( int i = (vec.size() - 2) / 2; i>=0; --i )
{
downAdjust(vec, i);
}
}
int main(int argc, char** argv)
{
test02();
system("pause");
return 0;
}