堆排序

#include <stdio.h>
int v[100];
int n;
void build (int i,int e)
{
    int j=i;
    while(2*j<=e)         //防止越界,考慮單支情況
    {
        int l;
        if(j*2<e&&v[2*j]<v[2*j+1])  l=2*j+1;     
        else   l=2*j;
        if(v[j]<v[l])
        {
            int temp=v[j];
            v[j]=v[l];
            v[l]=temp;
            j=l;
        }
        else j=e;
    }
}
void heapsort ()       //堆排序
{
    for(int i=n/2;i>0;i--)       //從最後一個非葉結點構造堆結構
    build(i,n);
    for(int i=n;i>=2;i--)
    {
        int temp=v[i];
        v[i]=v[1];
        v[1]=temp;
        build(1,i-1);
    }
}
int main ()
{
    while(scanf("%d",&n)==1)
    {
        for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
        heapsort();
        for(int i=1;i<=n;i++)
        if(i!=n)  printf("%d ",v[i]);
        else   printf("%d/n",v[i]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章