您的位置:首页 > 其它

算法导论 堆排序

2015-04-01 16:17 148 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法-堆排序