二路合并排序算法

//分治排序
//分解:将n个元素分解成n/2个子序列
//解决:用合并排序法递归的排序个子序列
//合并:合并两个已排序好的子序列

//本人水平有限,此代码指供参考,如有错误请赐教,我会及时更新文章。
#include <iostream>
using namespace std;
const int num=16;
//合并已经排序好的数据,
void merge(int *p,int n1,int n2,int n3)//1 1 2  //0 2 4
{
 //当合并数据下标为1,1,2是,要合并的数据元素为第一个和第二个。
 int len=(n2==n1)?1:((n3-n1+1)/2);
 int *A=new int[len];
 int *B=new int[len];
 for (int z=0;z<len;z++)
 {
  A[z]=p[n1+z-1];//A,B保存临时要合并的数据
  B[z]=p[n2+z];
 }
    int i=0,j=0;
 int n11=n1-1;
 if (n1<=n2&&n2<n3)
 {
  //取出A,B中小的元素写到p
  while (i!=len&&j!=len)
  {
   if (A[i]>B[j])
   {
    p[n11++]=B[j++];
   }
   else if (A[i]<B[j])
   {
    p[n11++]=A[i++];
   }
   else
   {
    p[n11++]=A[i++];
    p[n11++]=B[j++];
   }
   if (i==len&&j!=len)
   {
    while (j!=len)
    {
     p[n11++]=B[j++];
    }
   }
   if (j==len&&i!=len)
   {
    while (i!=len)
    {
     p[n11++]=A[i++];
    }
   }
  }

 }
}
//递归分解子序列
void merge_sort(int *p,int first,int last)

 if (last>first)
 {
  int temp=(first+last)/2;
  merge_sort(p,first,temp);
  merge_sort(p,temp+1,last);
  merge(p,first,temp,last);
 }  
}
void main()
{
 int iData[num]={9,1,13,5,2,8,10,7,15,6,11,12,16,4,14,3};
 std::cout<<"原数据为:     ";
 for (int i=0;i<sizeof(iData)/4;i++)
 {
  std::cout<<iData[i]<<" ";
 }
 merge_sort(iData,1,sizeof(iData)/4);
 std::cout<<endl<<"排序后数据为: ";
 for (int j=0;j<sizeof(iData)/sizeof(int);j++)
 {
  std::cout<<iData[j]<<" ";
 }
 std::cout<<endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值