二路归并c++完整版,可运行

#include <iostream>
using namespace std;

//[s,m]和[m+1,t]的合并
void merge (int r[],int r1[], int s,int m, int t)
{
       int i=s,j=m+1,k=s;
       while((i<=m )&&(j<= t))
      {
         if (r[i]<=r [j])
         {
               r1[k++]=r [i++];
         }
         else
         {
               r1[k++]=r [j++];
         }
      }

       if (i<=m )
      {
             while(i<=m )
                   r1[k++]=r [i++];
      }
       else
             while(j<=t )
                   r1[k++]=r [j++];

       //必须非常注意,必须加上
       for (int x= s;x<=t ;x++) //排完序过后一定要将有序的序列更新到 r[]数组中,因为下次还是用 r[]进行比较的
                              //归并排序要求归并的是两个有序的序列
      {
             r[x]=r1[x];
      }
}

//二路归并总的递归过程
void mergesort (int r[],int r1[], int s,int t)
{
       if (s<t)
      {
             int m=(s+t)/2;
             mergesort(r,r1,s,m);
             mergesort(r,r1,m+1,t);
             merge(r,r1,s,m,t);
      }
}


int main ()

{
       //初始化   
       int r[10]={10,1,20,5,4,13,6,9,8,7};
       int r1[10];
       for (int i=0; i<10;i ++)
      {
             r1[i]=0;
      }
       //调用,排序
       mergesort(r,r1,0,9);

       for (int i=0; i<10;i ++)
      {
             cout<<r1 [i]<< " ";
      }


       system("pause" );

       return 0;


}
  


©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值