Heapsort

Heap是完全二叉树,所以可以用数组来隐式表示。对Heap的通常操作是删除和插入。删除就是去掉Heap的顶元素,然后重新建Heap.
思想是,令Heap[1]=Heap[n],然后调整这个Heap即可。

插入操作类似,只是从底部调整这个Heap;
n++;
child=n;
parent=n/2;
while(parent>=1)
{
 if([parent]<[child])
 {
  swap([parent],[child]);
  child=parent;
  parent=child/2;
 }
 else break; 
}

Heap排序包括两个步骤:
1,建立Heap;
2,排序

建立Heap可以自上而下,也可以自下而上,后者效率更高,因为是从n/2处开始做调整的。

C实现:
/* Heap sort */

void display_x(int x[])
{
 int i;
 for(i=1;i<=16;i++)
 {
  printf("%d ",x[i]);
 }
}
void swap(int *p1,int *p2)
{
 int temp;
 temp=*p1;
 *p1=*p2;
 *p2=temp;
}
void build_heap(int x[],int n)
{
 int child,temp_child;
 int parent,temp_parent;

 parent=n/2;
 child=parent*2;

 while(parent > 0)
 {
  if(child+1 <= n && x[child] < x[child+1])
  {
   child++;
  }
  if(x[child] > x[parent])
  {
   swap(&x[child],&x[parent]);
   /* adjust */
   temp_parent=child;
   temp_child=temp_parent*2;

   while(temp_child <= n-1)
   {
    if(x[temp_child] < x[temp_child+1])
    {
     temp_child++;
    }
    if(x[temp_child] > x[temp_parent])
    {
     swap(&x[temp_child],&x[temp_parent]);
     temp_parent=temp_child;
     temp_child*=2;
    }
    else
    {
     temp_child=n;
    }
   }
  }
  parent--;
  child=parent*2;
 }
}

void rearrange_heap(int x[],int n)
{
 int parent;
 int child;

  parent=1;
  child=2;
  while(child <= n-1)
  {
   if(x[child] < x[child+1])
   {
    child++;
   }
   if(x[child] > x[parent])
   {
    swap(&x[child],&x[parent]);
    parent=child;
    child*=2;
   }
   else
   {
    child=n;
   }
  }
}

void heap_sort(int x[],int n)
{
 int i;

 build_heap(x,n);
 display_x(x);
 for(i=n;i>=2;i--)
 {
  swap(&x[1],&x[i]);
  rearrange_heap(x,i-1);

 }
 printf("\n");
 display_x(x);
}

main()
{
 int x[17]={0,6,2,8,5,10,9,12,1,15,7,3,13,4,11,16,14};
 int i;

 clrscr();

 heap_sort(x,16);
}

posted @ 2007-04-29 00:20  cacard  阅读(734)  评论(1编辑  收藏  举报