首页 > 编程语言 > 详细

堆排序

时间:2015-11-29 14:58:37      阅读:236      评论:0      收藏:0      [点我收藏+]

思想:

1.构建最大堆

2.把根节点和最后一个节点交换,,把堆长度-1,也就不考虑放最后的最大的元素了,再构建最大堆

3.现在第二大的元素在根节点了,我们再重复步骤2,直到堆长度为1

int MaxHeap(int DataArray[],int Father,int DataLen){
    int LeftSon=Father<<1;
    int RightSon=LeftSon+1;
    int largest=Father;
    if(LeftSon<=DataLen&&DataArray[LeftSon]>DataArray[Father]){
        largest=LeftSon;
    }
    if(RightSon<=DataLen&&DataArray[RightSon]>DataArray[largest]){
        largest=RightSon;
    }

    if(largest!=Father){
        int tem=DataArray[Father];
        DataArray[Father]=DataArray[largest];
        DataArray[largest]=tem;
        MaxHeap(DataArray,largest,DataLen);
    }
}
int BuildHeap(int DataArray[],int DataLen){
    for(int i=DataLen>>1;i>=1;i--)
        MaxHeap(DataArray,i,DataLen);
}
int HeapSort(int DataArray[],int DataLen){
    BuildHeap(DataArray,DataLen);
    int tmp;
    for(int i=DataLen;i>=2;i--){
        tmp=DataArray[i];
        DataArray[i]=DataArray[1];
        DataArray[1]=tmp;
        MaxHeap(DataArray,1,i-1);
    }
}

调用:

for(int i=1; i<=n; i++) //注意是从1开始
        cin>>a[i];
HeapSort(a,n);
for(int i=1; i<=n; i++)cout<<a[i]<<" ";

  

堆排序

原文:http://www.cnblogs.com/flipped/p/5004708.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!