归并排序

/*

示例二:归并排序

具体步骤: 1:分开 2:求解子问题 3:合并

其核心设计思想就是分治法:

在归并排序当中,首先是将其问题变小为其1/2然后分别从左右两侧继续

进行分化,将排序后的重新置换为原来的数组,这样才能使其有序,

在排序的比较当中也是通过分段处理来进行s--t 以m为枢轴,进行如果没有比较完毕

则进行数据的追加以保证数据在排序的分方法里面有序,这便是归并排序的具体

算法实现

*/

 

#include <iostream>

using namespace std;

 

//归并的合拢

void meg(int [],int [],int [],int s,int m,int t);

//排序的具体算法

void megsort(int [],int [],int s,int t );

int counter = 0;//输入数据控制

 

int main()

{

int n;

int a[100];

int b[100];

cin>>n;//输入数据的个数

int  i = 0;

for(i = 0 ;i< n;i++)//初始化b数组 

   b[i] = 0;

 

while(n--)

{

cin>>a[counter++];

}

 

megsort(a,b,0,counter-1);//调用具体的算法

for(i = 0;i< counter;i++) //输出调用后的结果

{

cout<<a[i]<<endl;

}

return 0;

}

 

 

void meg(int r[],int r1[],int s,int m,int t)

{

 

int i = s;  //初始化指针计数器 i 表示左边的

int j = m+1; //初始化指针计数器 j 表示枢轴(m)右边的

int k = s;

while(i<=m&& j<=t)//找两边较小的数据存入到r1[]中

{

if(r[i]<=r[j]) r1[k++]  = r[i++];

else r1[k++] = r[j++];

}

while(i<=m)  //如果左边没有记录完毕则将其后面的数据存入到数组r1中

{

        r1[k++] =r[i++];  

}

while(j<=t) //如果右边没有记录完毕 则将其后面的数据存入到数组r1中

{

        r1[k++] =r[j++];  

}

 

for(int kk = 0 ;kk< counter;kk++) //将临时变量传给具体变量

r[kk] = r1[kk];

}

void megsort(int r[],int r1[],int s,int t )

{

if(s== t) r1[s]  = r[s];

else

{

int m = (s+t)/2;  //二分找中间的枢轴

megsort(r,r1,s,m); //在左边继续执行二分

megsort(r,r1,m+1,t);//在右边继续执行二分

meg(r1,r,s,m,t);//在排序的r1后将重新设置为初始数组r,为以后的递归准备

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值