//@lx HEAPSORT(A) p136
//time: 2010-9-13
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
template <class T>
inline void PRINT_ELEMENTS(const T& col1, const char* optcstr = "")
{
typename T::const_iterator pos;
cout << optcstr;
for(pos = col1.begin(); pos != col1.end(); ++pos)
{
cout << *pos << ' ';
}
cout << endl;
}
int LEFT(int i)
{
return 2*i;
}
int RIGHT(int i)
{
return 2 * i + 1;
}
int PARENT(int i)
{
return i / 2;
}
void exchange(int& a, int& b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
template <class T>
void MAX_HEAPIFY(vector<T>& A, int i)
{
int l = LEFT(i);
int r = RIGHT(i);
static int largest;
if(l <= A.size() && A[l-1] > A[i-1])
{
largest = l;
}
else
{
largest = i;
}
if(r <= A.size() && A[r-1] > A[largest-1])
{
largest = r;
}
if(largest != i)
{
exchange(A[i-1], A[largest-1]);
MAX_HEAPIFY(A, largest);
}
}
template <class T>
void BULD_MAX_HEAP(vector<T>& A)
{
int lenght = A.size();
for(int i = lenght / 2; i >= 1; i--)
{
//cout << endl << i-1 << endl;
MAX_HEAPIFY(A, i);
//PRINT_ELEMENTS(A);
}
}
template <class T>
void HEAPSORT(vector<T>& A)
{
BULD_MAX_HEAP(A);
vector<T> B;
T sum = A.size();
for(int i = sum; i >= 1; i--)
{
//exchangeA[1]-A[i]
T temp = A[i-1];
A[i-1] = A[0];
A[0] = temp;
//A.erase(i-1);
sum--;
B.push_back(A.back());
A.pop_back();
MAX_HEAPIFY(A, 1);
PRINT_ELEMENTS(A);
}
cout << endl << endl;
B.reserve();
PRINT_ELEMENTS(B);
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> A;
A.push_back(4);
A.push_back(1);
A.push_back(3);
A.push_back(2);
A.push_back(16);
A.push_back(9);
A.push_back(10);
A.push_back(14);
A.push_back(8);
A.push_back(7);
HEAPSORT(A);
//PRINT_ELEMENTS(A);
return 0;
}
HEAPSORT(A) P136
最新推荐文章于 2022-10-18 15:11:30 发布