经典排序算法的汇总之归并排序

21 篇文章 0 订阅
6 篇文章 0 订阅

经典排序算法的汇总之归并排序

归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序

 

void Mymerge(int  *a ,int  *b  ,int na,int nb)
{
   int  c[20]= {0};
   int  ic=0,ia=0, ib=0; //三个数组的下标  
   while(ia<na&&ib<nb)
   {
    if(a[ia]>b[ib])
    {
   c[ic]=b[ib++];
  ic++ ;
    }
    else
    {
   c[ic]= a[ia++];
  ic++;
  }
 }
 if(ib<nb)  //把剩余的数放入c
 {
  while( ib<nb)
  {
   c[ic++]=b[ib++];
  }
 }
 else if(ia<na)
 {
  while( ia<na)
  {
    c[ic++]=a[ia++];  
  }
 }

   //把c重新赋值给a ,b 数组
    ic=0,ia=0, ib=0; 
  while(ia <na)
 {
  a[ia++]=c[ic++] ;
 }
 while(ib<nb)
 {
  b[ib++]=c[ic++]; 
 }

}


//
  int cnt;  //逆序对的个数
void merge(int a[] ,int left ,int mid,int right)  //ok
{
 int  c[20]= {0};
   int  ic=0,ia=left, ib=mid+1; //三个数组的下标  
  
   while(ia<=mid&&ib<=right)
   {
    if(a[ia]>a[ib])
    {
   //小的在左边 逆序 左边剩余都比现在右边出来的大   都是逆序
   cnt+= mid-ia+1;
   c[ic]=a[ib++];
         ic++ ;
    }
    else 
    {
   c[ic]= a[ia++];
   ic++;
  
  }
 }
 if(ib<=right)  //把剩余的数放入c
 {
  while( ib<=right)
  {
   c[ic++]=a[ib++];
  }
 }
 else if(ia<=mid)
 {
  while(ia<=mid)
  {
    c[ic++]=a[ia++];  
  }
 }

   //把c重新赋值给a 数组
    ic=0,ia=left; 
  while(ia<=right)
 {
  a[ia++]=c[ic++];
 }
      cout<<cnt<<endl;
  //  show(a,4);
}
 void mergesort(int a[],int l ,int r)
 {
  int c[20]={0};
  if(l<r)
  {
      int m=(l+r)/2;
   mergesort(a,l,m );
   mergesort(a,m+1,r);
   merge(a,l,m,r);
  }
 }


 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值