堆排序

把一个结点放在合适的值上
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]调整为堆
    }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值