#include <stdio.h>
#include <conio.h>
void HeapAdjust(int a[],int s,int n)//大頂堆
{
int temp=a[s];
for(int j=2*s;j<=n;j*=2)
{
if(j<n&&a[j]<a[j+1]) j++;
if(temp>a[j]) break;//這個錯誤點困擾了我好長時間。temp寫成a[s]了,忘記了s[s]會發生變化。
a[s]=a[j];//一開始顛倒了
s=j;
}
a[s]=temp;
}
void HeapSort(int a[],int len)
{
for(int i=len/2;i>0;--i)
{
HeapAdjust(a,i,len);
}//建一個初始堆
for(int i=len;i>1;--i)
{
int temp=a[1];
a[1]=a[i];
a[i]=temp;
HeapAdjust(a,1,i-1);
}
}
int main()
{
int a[11]={0,9,8,7,1,6,4,3,5,2,0};
printf("初始序列");
for(int i=1;i<11;i++)
{
printf("%d ",a[i]);
}
HeapSort(a,10);
printf("排序後的序列");
for(int i=1;i<11;i++)
{
printf("%d ",a[i]);
}
getch();
return 0;
}
摘自:不喜歡熬夜的coder blog