就地堆排序(In-Place heap sort)
1)在输入数组的顶部就地构建堆,在构建堆时,仅影响当前正在处理的数组中的插槽。因此,在堆中插入第一个输入元素实际上并不会改变任何事情。然后插入第二个元素。唯一会影响数组中索引0和1的元素,因此,输入数组的其余部分仍然是安全的。只需要跟踪堆数组中与输入数组相同的元素数即可。
2)一旦构建了堆,需要执行从堆中删除并将其插入到输出数组的排序过程。在这里,使用了从数组后面开始构建输出数组的技巧。每次从堆中删除元素时,堆阵列的最后一个活动插槽实际上就变得可用。因此,可以将已删除的元素插入该插槽。通过继续执行此操作,可以对输出数组进行排序,但顺序相反。这意味着如果堆是<=堆,则输出数组将被> =排序。当然,在构建堆时,可以使用相反的顺序,使输出数组的顺序正确。
3)使用3个随机输入数组进行测试,长度为10、100、200。
HeapSorting.cpp
#include <iostream>
#include<random>
void MakeMaxHeap(int ary[], int n, int i)
{
//i is the last father root
int max = i;
int Maxnumber = i * 2 + 1;
//left child
if (ary[Maxnumber + 1] > ary[Maxnumber] && Maxnumber + 1 < n)
{
Maxnumber++;
}
// compare child which is larger(left or right)
if (Maxnumber<n &&ary[Maxnumber]>ary[max])</