堆排序

来源:互联网 发布:pip linux 编辑:程序博客网 时间:2024/05/16 18:18
#include <iostream>#include<algorithm>#include<cstdio>using namespace std;//  构造大顶堆//  a 是要进行调整的堆数组  i是从第i个元素开始调整(其实就是最靠后的一个不是叶子节点的节点)//  size是要进行调整的对数组的元素个数 用于确定在往下递归的时候不越界//  这是在调整堆的时候的单独调用模块就是  调整单个节点的模块void heapAdjust(int *a,int i,int size){    int lchild = 2*i;    int rchild = 2*i+1;    int max = i;    if(i<=size/2)    {        if(lchild<=size&&a[lchild]>a[max])        {            max = lchild;        }        if(rchild<=size&&a[rchild]>a[max])        {            max = rchild;        }        if(max!=i)        {            swap(a[max],a[i]);            heapAdjust(a,max,size);        }    }}// 用于建立堆 调用上面的模块void buildHeap(int *a,int size){    //采用倒序的方式调整堆 这是在建立堆的时候比较优秀的做法    //这是在静态的维护一个堆   如果动态的维护一个堆  有添加元素 和删除元素的话    //删除堆顶元素  向下一步一步调整 通过while就行了 因为只是在原有堆的基础上改动一下    //所以动作较小  沿着一条路下去就行了   这里是在一个数组中维护这个堆    //其实在排序的时候思路是一致的    for(int i=size/2;i>=1;i--)    {        heapAdjust(a,i,size);    }}void heapSort(int *a,int size){   buildHeap(a,size);   for(int i=size;i>=1;i--)   {       //cout<<a[1]<<" ";       swap(a[1],a[i]);       heapAdjust(a,1,i-1);   }}int main(){    int a[100];    int size;    while(scanf("%d",&size)==1&&size!=0)    {         for(int i=1;i<=size;i++)         {             cin>>a[i];         }         heapSort(a,size);         for(int i=1;i<=size;i++)         {             cout<<a[i]<<" ";         }         cout<<endl;    }    return 0;}
对于给定的数组  进行堆排序 从小到大
原创粉丝点击