/*
示例二:归并排序
具体步骤: 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,为以后的递归准备
}
}