思路:
void adjustheap(int* ar,int start,int end)
{
int tmp = ar[start];
int i = start;
int j = 2 * start + 1;//左孩子
while (j <= end)
{
if (j<end && ar[j + 1]>ar[j])
{
j += 1;
}
if (ar[j] > tmp)//本来是要把tmp放到这个位置的,可是他如果小于他的孩子就没有放的必要了,直接把孩子放上来就行了,tmp在原本孩子的位置,但还是会出现他小于他的孩子,所以干脆一直跟孩子比较就行了,直到找到比孩子都大的位置再放
{
ar[i] = ar[j];//孩子上位
i = j;//i成为j
}
else break;//j是i的孩子,此时孩子们均比tmp小,说明找到了最大堆的位置,就是i,不用怕i被覆盖,因为i的值早就给了父节点,要不也到不了这一步.
j = 2 * i + 1;//j为i根的孩子
}
ar[i] = tmp;
}
void heapsort(int* ar, int size)
{
int len = size - 1;
for (int i = (len - 1) / 2; i >= 0; --i)
{
adjustheap(ar, i, len);//构建最大堆
}
for (len; len > 0; --len)
{
std::swap(ar[0], ar[len]);
adjustheap(ar, 0, len - 1);
}
}