支持动态维护的堆排序

来源:互联网 发布:喝咖啡会难怀孕吗 知乎 编辑:程序博客网 时间:2024/05/21 06:58
#include <iostream>#include<algorithm>#include<cstdio>using namespace std;//动态的维护一个大顶堆 支持 添加数据 和删除堆顶数据 并且总保持有序状态//数组从a[1] 开始void addAdjust(int *a,int size){    int id = size;    while(id/2!=0&&a[id]>a[id/2])    {        swap(a[id],a[id/2]);        printf("%d %d\n",a[id],a[id/2]);        id =  id/2;    }}//删除堆顶元素void deleteAdjust(int *a,int size){     int id = 1;     a[id] = 0;     while(id<=size/2)     {        int lchild = id*2<size?id*2:0;        int rchild = id*2+1<size?id*2+1:0;        if(lchild*rchild)         {             if(a[lchild]>a[rchild])             {                 swap(a[lchild],a[id]);                 id = lchild;             }             else             {                 swap(a[rchild],a[id]);                 id = rchild;             }         }         else if(lchild)         {             swap(a[lchild],a[id]);             id = lchild;             break ;         }         else         {             break ;         }     }     //一旦  跑到的位置不是最后位置     if(id!=size)     {         a[id] = a[size];         while(a[id]>a[id/2])         {             swap(a[id],a[id/2]);             id = id/2;         }     }}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){    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--)     {        swap(a[1],a[i]);        //cout<<a[1]<<" ";        heapAdjust(a,1,i-1);     }}int main(){    int a[100];    int size = 0;    int data;    char s[1];    while(scanf("%s",s)!=EOF)    {        if(s[0]=='a')        {            scanf("%d",&data);            a[++size] = data;            addAdjust(a,size);        }        if(s[0]=='d')        {            deleteAdjust(a,size);            size--;        }        if(s[0]=='p')        {            for(int i=1;i<=size;i++)            {                cout<<a[i]<<" ";            }            cout<<endl;            heapSort(a,size);            for(int i=1;i<=size;i++)            {                cout<<a[i]<<" ";            }            cout<<endl;        }    }    return 0;}


原创粉丝点击