堆排序

来源:互联网 发布:唐泽寿明知乎 编辑:程序博客网 时间:2024/04/28 13:46
把一个结点放在合适的值上
void Sift(RecType R[],int k,int n)
{//k表示被筛选的结点的关键字,n表示待排序的记录个数
 int i, j;
  i=k;
  j=2*i;                       //计算R[i]的左孩子位置
  R[0]=R[i];                  //将R[i]保存在临时单元中
  while(j<=n)
  {  if((j<n)&&(R[j].key>R[j+1].key))
        ++j;                   //选择左右孩子中最小者
      if(R[0].key>R[j].key) //当前结点大于左右孩子的最小者
      { R[i]=R[j];
        i=j; j=2*i; }
      else                    //当前结点不大于左右孩子
         break;   
  }
   R[i]=R[0];                 //被筛选结点放到最终合适的位置上

}


堆排序的算法描述如下:void Heap_Sort(RecType R[],int n){ int j;   for(j=n/2;j>0;--j)          //建初始堆         Sift(R,j,n);      for(j=n;j>1;--j)
   {         //进行n-1趟排序        R[0]=R[1];              //将堆顶元素与堆中最后一个元素交换          R[1]=R[j]; R[j]=R[0];         Sift(R,l,j-1);            //将R[1]..R[j-1]调整为堆    } }


原创粉丝点击