#include <iostream>
#include <array>
template<typename T, typename Arg>
void Swap(T& T_Container, Arg val1, Arg val2) noexcept
{
typename T::value_type tmp_val{T_Container[val1]};
T_Container[val1] = T_Container[val2];
T_Container[val2] = tmp_val;
}
template<typename T, typename Arg>
void AdjustHeap(T& T_Container, Arg node_idx, Arg len)
{
typename T::value_type tmp_val{T_Container[node_idx]};
for (Arg leaf_idx{node_idx * 2}; leaf_idx < len; leaf_idx *= 2)
{
if (T_Container[leaf_idx + 1] > T_Container[leaf_idx])
{
++leaf_idx;
}
if (T_Container[leaf_idx] <= tmp_val)
{
break;
}
T_Container[node_idx] = T_Container[leaf_idx];
node_idx = leaf_idx;
}
T_Container[node_idx] = tmp_val;
}
template<typename T>
void HeapSort(T& T_Container)
{
for (auto i{static_cast<int>(T_Container.size()) / 2 - 1}; i >= 0; --i)
{
AdjustHeap(T_Container, i, static_cast<int>(T_Container.size()));
}
for (auto j{static_cast<int>(T_Container.size()) - 1}; j >= 0; --j)
{
Swap(T_Container, 0, j);
AdjustHeap(T_Container, 0, j - 1);
}
}
template<typename T>
void Display(T& T_Container)
{
std::cout << " 排序前:";
for (const auto& val : T_Container)
{
std::cout << val << " ";
}
std::cout << std::endl;
HeapSort(T_Container);
std::cout << " 排序后:";
for (const auto& val : T_Container)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
int main(void)
{
std::array<int, 5> arr{6, 3, 2, 9, 7};
Display(arr);
return 0;
}
程序链接
https://godbolt.org/z/Pn7b4vPxv
有不对的地方欢迎指正!!!!=。=