堆排序在最差情况下相比快速排序,具有更好的时间复杂度。
template
<
class
T
>
void adjust_heap(vector < T > & Vct, int First, int Last)
{
int CurrentPos = First;
int ChildPos = 2 * CurrentPos + 1;
T Temp = Vct[First];
while (ChildPos <= Last-1)
{
if (ChildPos+1 <= Last-1 && Vct[ChildPos] < Vct[ChildPos+1])
ChildPos += 1;
if (Temp < Vct[ChildPos])
{
Vct[CurrentPos] = Vct[ChildPos];
CurrentPos = ChildPos;
ChildPos = 2 * CurrentPos + 1;
}
else
break;
}
Vct[CurrentPos] = Temp;
}
template < class T >
void make_heap(vector < T > & Vct)
{
int LastPos = Vct.size();
int HeapPos = (LastPos - 2) / 2;
while (HeapPos >= 0)
{
adjust_heap(Vct, HeapPos, LastPos);
HeapPos--;
}
}
template < class T >
void heap_sort(vector < T > & Vct)
{
make_heap(Vct);
int n = Vct.size();
for (int i = n; i > 1; i--)
pop_heap(Vct, i);
}
void adjust_heap(vector < T > & Vct, int First, int Last)
{
int CurrentPos = First;
int ChildPos = 2 * CurrentPos + 1;
T Temp = Vct[First];
while (ChildPos <= Last-1)
{
if (ChildPos+1 <= Last-1 && Vct[ChildPos] < Vct[ChildPos+1])
ChildPos += 1;
if (Temp < Vct[ChildPos])
{
Vct[CurrentPos] = Vct[ChildPos];
CurrentPos = ChildPos;
ChildPos = 2 * CurrentPos + 1;
}
else
break;
}
Vct[CurrentPos] = Temp;
}
template < class T >
void make_heap(vector < T > & Vct)
{
int LastPos = Vct.size();
int HeapPos = (LastPos - 2) / 2;
while (HeapPos >= 0)
{
adjust_heap(Vct, HeapPos, LastPos);
HeapPos--;
}
}
template < class T >
void heap_sort(vector < T > & Vct)
{
make_heap(Vct);
int n = Vct.size();
for (int i = n; i > 1; i--)
pop_heap(Vct, i);
}