复习排序-归并排序

归并排序

两两归并排序,递归和非递归方法。待排序元素有n个,可以将n个元素分为n/2个归并组,余下的按n/4个为归并组,直到最后完全归并。

算法实现一:递归归并。

void Mergesort(int *num,int length)
{
   int *sort = (int*)malloc(length*sizeof(int));
   if(sort == NULL)
      exit(-1);
   Mergesort_recursion(num,0,length-1,sort);
}
void Mergesort_recursion(int *num,int low,int high,int *sort)
{
    int m;
    int(low == high)
       sort[low] = num[low];
    else
    {
         m=(low+high)/2;
         Mergesort_recursion(num,low,m,sort);
         Mergesort_recursion(num,m+1,high,sort);
         Merge(sort,low,m,high,num);
    }
}
void Merge(int *sort,int low,int m,int high,int *num)
{
    int i,j,k;
    for(i=low,j=m+1,k=low;i<=m&&j<=high;k++)
       if(sort[i]>sort[j])
          num[k]=sort[j++];
       else
          num[k]=sort[i++];
    while(i<=m)
       num[k++]=sort[i++];
    while(j<=high)
       num[k++]=sort[j++];
    for(i=0;i<=high;i++)
       sort[i]=num[i];
}


算法实现二:非递归实现,难点在于对范围的选择。递归过程需要由自己设计实现,主要思想就是先实现(k初值为1)k*=2个元素合并排序,如果剩余一个就直接写入到已归并的数组;接着实现4个元素合并排序,如果此时不止一个元素剩余但又不满4个,将这些剩下的直接归并。直到k>待排序数据长度为止。

void Mergesort(int *num,int length)
{
   int *sort = (int*)malloc(length*sizeof(int));
   if(sort == NULL)
       exit(-1);
   int k=1;
   while(k<=length)
   {
       Mergesort_unrecursion(num,k,length,sort);
       k*=2;
   }
}
void Mergesort_unrecursion(int *num,int k,int length,int *sort)
{
   int i=0;
   while(i<length-2*k)
   {
      Merge(num,i,i+k-1,i+2*k-1,sort);
      i=i+2*k;
   }
   if(i < length-k+1)
      Merge(num,i,i+k-1,length-1,sort);
   else
      sort[length-1]= num[i];
 
}
void Merge(int *sort,int low,int m,int high,int *num)
{
   int i,j,k;
   for(i=low,j=m+1,k=low;i<=m&&j<=high;k++)
      if(sort[i]>sort[j])
          num[k]=sort[j++];
      else
          num[k]=sort[i++];
   while(i<=m)
      num[k++]=sort[i++];
   while(j<=high)
      num[k++]=sort[j++];
   for(i=0;i<=high;i++)
      sort[i]=num[i];
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值