#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstdlib>
using namespace std;
void DownAdjust(vector<int> & vec, int parentIndex, int length)
{
int temp = vec[parentIndex];
int childIndex = 2 * parentIndex + 1;
while (childIndex < length)
{
if (childIndex + 1 < length && vec[childIndex + 1] > vec[childIndex])
{
childIndex++;
}
if (temp >= vec[childIndex])
{
break;
}
else
{
vec[parentIndex] = vec[childIndex];
parentIndex = childIndex;
childIndex = 2 * childIndex + 1;
}
}
vec[parentIndex] = temp;
}
void MaxHeapSort(vector<int> & vec)
{
int length = vec.size();
if (length <= 1)
{
return ;
}
else
{
for (int i = (length - 1) / 2; i >= 0; --i)
{
DownAdjust(vec, i, length);
}
cout << "大顶堆构建完毕后:" << endl;
for (int i = length - 1; i > 0; --i)
{
swap(vec.front(), vec[i]);
DownAdjust(vec, 0, i);
}
}
}
int main()
{
vector<int> vec = {4, 5, 2, 3, 1, 7, 6, 8, 10, 9};
for (int i = 0; i < vec.size(); ++i)
{
cout << vec[i] << '\t';
}
cout << endl;
MaxHeapSort(vec);
for (int i = 0; i < vec.size(); ++i)
{
cout << vec[i] << '\t';
}
cout << endl;
}
#include <iostream>
#include <vector>
using namespace std;
void DownAdjust(vector<int> & vec, int parentIndex, int length)
{
int temp = vec[parentIndex];
int childIndex = parentIndex * 2 + 1;
while (childIndex < length)
{
if (childIndex + 1 < length && vec[childIndex + 1] < vec[childIndex])
{
childIndex++;
}
if (temp <= vec[childIndex])
{
break;
}
else
{
vec[parentIndex] = vec[childIndex];
parentIndex = childIndex;
childIndex = parentIndex * 2 + 1;
}
}
vec[parentIndex] = temp;
}
void MinHeapSort(vector<int> & vec)
{
int length = vec.size();
if (length <= 1)
{
return ;
}
else
{
for (int i = (length - 1) / 2; i >= 0; --i)
{
DownAdjust(vec, i, length);
}
for (int i = length - 1; i > 0; --i)
{
swap(vec.front(), vec[i]);
DownAdjust(vec, 0, i);
}
}
}
int main()
{
vector<int> vec = {4, 5, 2, 3, 1, 7, 6, 8, 10, 9};
for (int i = 0; i < vec.size(); ++i)
{
cout << vec[i] << '\t';
}
cout << endl;
MinHeapSort(vec);
for (int i = 0; i < vec.size(); ++i)
{
cout << vec[i] << '\t';
}
cout << endl;
}