您的位置:首页 > 其它

选择排序之--堆排序

2017-08-03 14:03 295 查看
#include <stdio.h>
#include<malloc.h>
void swap(int *x,int *y)
{
*x^=*y;
*y^=*x;
*x^=*y;
}
void HeapAdjust(int A[],int len,int i)
{
if(A==NULL||len<=0||2*i+1>=len)
return ;
while(2*i+1<len)   //i存在左孩子
{
int large=2*i+1;
if(2*i+2<len && A[2*i+2]>A[2*i+1])
large=2*i+2;

if(A[i]<A[large])
swap(&A[i],&A[large]);
else
break;
i=large;
}
}

//堆排序
void HeapSort(int A[],int len)
{
for(int i=len>>1-1;i>=0;i--)   //最后一个非叶子结点序号为len/2-1;
HeapAdjust(A,len,i);

for(i=len-1;i>=1;i--)    // 真正的排序过程
{
swap(&A[i],&A[0]);
HeapAdjust(A,i,0);     //重建堆
//HeapAdjust(A+len-i,i,0);
}
}
void main( )
{
int A[8]={3,8,4,6,2,5,11,40};

HeapSort(A,8);
printf("输出排序后:\n");
for (int i = 0; i < 8; i++)
printf("%d ", A[i]);  //等价于 *(A+i)
getchar();getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐