int sort_heap(int arr[],int len)
{
int k,i,j,l;
for(k=len;k>1;k--)//len-1次循环
{
for(i=k/2;i>=0;i--)//从中间位置开始遍历
{
for(j=i;j*2+1<k;)//child进行遍历
{
l=j*2+1;//left child
if(l+1<k && arr[l]<arr[l+1])
{
l++;
}
if(arr[l]>arr[j])
{
swap(&arr[l],&arr[j]);
j=l;
}
else
{
break;
}
}
}
swap(&arr[0],&arr[k-1]);
}
}
extern int swap(int *a , int *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
int main()
{
int arr[8]={2,3,5,1,9,8,4,6},i;
sort_heap(arr,8);
for(i=0;i<8;i++)
{
printf ("%d,",arr[i]);
}
return 0;
}
堆排主要分两步:
1、循环n-1次,每次找出最大的一个,然后与最后一个替换,循环一次,将最大索引-1
2、从中间开始循环,将最大的一个放入支点,并将子节点按大小顺序排好