归并排序

来源:互联网 发布:淘宝直播一般佣金多少 编辑:程序博客网 时间:2024/05/16 05:47

/*

示例二:归并排序

具体步骤: 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,为以后的递归准备

}

}

原创粉丝点击