无序序列升序排序。
步骤:
根据无序序列建立大根堆:筛选需要从完全二叉树中最后一个非叶节点的位置开始,逐层向上倒退,直到根节点。
重建堆:除去堆顶元素,以堆中最后一个元素代替之。此时根节点的左右子树均为堆,需要自上至下进行调整重新得到大根堆,重复。
#include <stdio.h>
#include <stdlib.h>
void HeapAdjust(int arr[], int i, int length)
{
int Child;
int temp;
for(;2*i+1<length;i=Child)
{
Child = 2*i + 1;
if(Child<length-1&&arr[Child + 1] > arr[Child])
++Child;
if(arr[i] < arr[Child])
{
temp = arr[i];
arr[i] = arr[Child];
arr[Child] = temp;
}
else
break;
}
}
void HeapSort(int arr[], int length)
{
int i;int t;
for(i = length/2 - 1; i >= 0; --i)
HeapAdjust(arr, i, length);
for(i = length - 1; i > 0; --i)
{
t=arr[i];
arr[i]=arr[0];
arr[0]=t;
HeapAdjust(arr, 0, i);
}
}
int main()
{
int i,n;int num[100];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
HeapSort(num,n);
for(i=0;i<n; i++)
{
printf("%d ", num[i]);
}
printf("\n");
return 0;
}