建堆以及堆排序—C

来源:互联网 发布:杰森基德生涯数据 编辑:程序博客网 时间:2024/06/05 03:39

1、建立最小堆,从小到大排序 ,时间复杂度为O(NlogN)

#include<stdio.h>
int h[100];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
return;
}

//向下调整成最小堆
void siftdown(int i)
{
   int t,flag=0;
   while(2*i<=n && flag==0)
   {
       if(h[2*i]<h[i])
           t=2*i;
       else
           t=i;
       if(2*i+1 <= n)
       {
           if(h[2*i+1]<h[t])
              t=2*i+1;
       }
       if(t!=i)
       {
           swap(t,i);
           i=t;
       }
       else
          flag=1;
   }
   return;
}
void creat()
{
    int i;
    for(i=n/2;i>=1;i--)
        siftdown(i);
    return;
}
int deletemin()
{
    int t;
    t=h[1];
    h[1]=h[n];
    n--;
    siftdown(1);
    return t;
}
int main()
{
  int i,num;
  scanf("%d",&num);
  n=num;
  for(i=1;i<=num;i++)
    scanf("%d",&h[i]);
  creat();
  for(i=1;i<=num;i++)
    printf("%d ",deletemin());
  return 0;
}

2、建立最大堆,从小到大排序,最大元素在h[1],将h[1]与h[n]交换,此时h[n]就是数组中的最大元素。交换后还需将h[1]向下调整以保持堆的特性。直到排好所有元素的顺序。

#include<stdio.h>
int h[100];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
return;
}
//向下调整成最大堆
void siftdown(int i)
{
   int t,flag=0;
   while(2*i<=n && flag==0)
   {
       if(h[2*i]>h[i])
           t=2*i;
       else
           t=i;
       if(2*i+1 <= n)
       {
           if(h[2*i+1]>h[t])
              t=2*i+1;
       }
       if(t!=i)
       {
           swap(t,i);
           i=t;
       }
       else
          flag=1;
   }
   return;
}
void creat()
{
    int i;
    for(i=n/2;i>=1;i--)
        siftdown(i);
    return;
}
//堆排序
void heapsort()
{
    while(n>1)
    {
        swap(1,n);
        n--;
        siftdown(1);
    }
    return ;
}
int main()
{
  int i,num;
  scanf("%d",&num);
  n=num;
  for(i=1;i<=num;i++)
    scanf("%d",&h[i]);
  creat();
  heapsort();
  for(i=1;i<=num;i++)
    printf("%d ",h[i]);
  return 0;
}

原创粉丝点击