利用堆排序的思想将一个数组按递增的顺序进行排序,将数组的第一个位置空下(下标为0),因为会导致子节点和本身同一个结点(i和2i一致),每次堆排序在下标1的位置放上了最大值,然后和最后一个元素交换位置,使之最大值依次放在最后的位置上,最后得到一个递增序列
代码实现如下:
//堆排序的简单实现
#include<stdio.h>
#include<stdlib.h>
void HeapSort(int a[], int n)
{
int end=8,x,y,z;
// 进行堆排序,每次找出最大值放在第一个元素位置
while(end-1){
while(1){
int pa=end/2,tag=0;
while(pa>0){
if(a[pa]<a[2*pa])
{
x=a[pa];
a[pa]=a[2*pa];
a[2*pa]=x;
tag=1;
}
if(2*pa+1<=end&&a[pa]<a[2*pa+1])
{
y=a[pa];
a[pa]=a[2*pa+1];
a[2*pa+1]=y;
tag=1;
}
pa--;
}
if(!tag) break;
}
// 将找出的最大值与最后一个元素调换位置
z=a[1];
a[1]=a[end];
a[end]=z;
end--;
}
}
int main(void)
{
int a[9]={-1,3,2,5,8,4,7,6,9};
HeapSort(a,9);
// 输出整体调整后的数组
for(int i=1;i<9;i++){
printf("%5d",a[i]);
}
return 0;
}
分析:将下标0的位置空下来,用数值为-1废掉,然后将3,2,5,8,4,7,6,9进行排序最终得到2,3,4,5,6,7,8,9