堆:一种数据结构,可以被视为完全二叉树。堆分为最大堆和最小堆,最大堆即每个父节点比子节点大,最小堆反之。结点i的左孩子结点为i<<2,右孩子结点为 i<<2+1;堆排序算法,涉及到建堆和维护堆(具体见代码,不多说)。用堆排序即每次取根节点(一定为最大元素),根节点与最后一个结点对调,最后一个节点退出堆,进行堆的维护,依次进行下去即完成排序。堆排序最坏时间复杂度O(n*logn),平均复杂度接近O(n*logn) ,它是不稳定的排序算法。代码如下:
#include<stdio.h>

const int MAX_SIZE = 20;
int test[MAX_SIZE];
int size,copysize;

void INIT() {
  int i;
  scanf("%d ",&size);
  copysize = size;
  for(i = 1; i <= size; i++)
  {
    scanf("%d ",&test[i]);
  }
  return;
}

void MAX_HEAPIFY(int i) {
  int l,r,largest,tmp;
  l = i<<1;
  r = (i<<1) + 1;
  if(l <= size && test[l] > test[i])
    largest = l;
  else
    largest = i;

  if(r <= size && test[r] > test[largest])
    largest = r;

  if(largest != i)
  {
    tmp = test[i];
    test[i] = test[largest];
    test[largest] = tmp;
    MAX_HEAPIFY(largest);
  }
  return ;

}    

void BUILD_MAX_HEAP()
{
  int i = size/2;
  for(; i > 0; i--)
  {
    MAX_HEAPIFY(i);
  }
}

void HEAP_SORT()
{
  int tmp;
  while(size > 1)
  {
    BUILD_MAX_HEAP();
    tmp = test[size];
    test[size] = test[1];
    test[1] = tmp;
    size--;
  }
  return;

}

void PRINTF()
{
  int i;
  for(i = 1; i <= copysize; i++)
  {
    printf("%d ",test[i]);
  }
  return;
}

void main ()
{
  freopen("input.txt","r",stdin);
  INIT();
  HEAP_SORT();
  PRINTF();  
}