码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2015-11-29 15:01:16      阅读:155      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!