#include <stdio.h>
#include <stdlib.h>
//求左孩子下标
inline int Left(int i)
{
return i<<1;
}
//求右孩子下标
inline int Right(int i)
{
return (i<<1)+1;
}
//求父节点下标
inline int Parent(int i)
{
return i/2;
}
int count = 10;
//调整某元素为根节点的堆为最大堆
void max_heap(int* a,int i)
{
int l = Left(i);
int r = Right(i);
int largest;
if(l<count&&a[l]>a[i])
largest = l;
else
largest = i;
if(r<count&&a[r]>a[largest])
largest = r;
if(largest != i)
{
a[largest] = a[largest]^a[i];
a[i] = a[largest]^a[i];
a[largest] = a[largest]^a[i];
max_heap(a,largest);
}
}
//建立最大堆
void bulid_max_heap(int* a)
{
int i=0;
for(i=count/2;i>=1;i--)
max_heap(a,i);
}
//堆排序
void heap_sort(int* a)
{
if(count <= 1)
return;
int i;
for(i=count-1;i>=2;i--)
{
a[1] = a[1]^a[i];
a[count-1] = a[1]^a[i];
a[1] = a[1]^a[i];
count--;
max_heap(a,1);
}
}
int main()
{
int a[] ={0,2,3,4,1,10,8,6,9,7};
int i ;
//for(i=1;i<10;i++)
//scanf("%d",&a[i]);
for(i=1;i<10;i++)
printf("%d ",a[i]);
printf("\n");
bulid_max_heap(a);
heap_sort(a);
for(i=1;i<10;i++)
printf("%d " ,a[i]);
system("pause");
return 0;
}
算法导论 堆排序
最新推荐文章于 2022-03-22 11:43:38 发布