归并排序

                                              归并排序

递归的函数

void sort(int l, int r)

{

if(l<r)

{int m=(l+r)/2;

sort(l,m);//左面

sort(m+1,r);//右边

merge(l,m,r);

 

}}

1、随机给数组一排数字 把它存进全局数组arr[]中。

2、里面有6个数,我们定义一个 int m作为中间数值为 m=(l+r)/2 ,也就是m=(0+6)/2  ,这个m是作为中间数,我们把左面的设一个变量 int l, 右面设的变量为 int r。

 

3、我们看函数一步一步走 if(l<r)成立 ,往下 m=(l+r)/2  l为0,r为6 m=3 ,进左递归 sort(l,m);//左面,参数l,m 0和3传进去 递归第二层中 l为0,r=3。

第二层中  if(i<r)依然成立,继续 m=(0+3)/2 这里我们把m 4舍5入 为2,接着进左递归 sort(l,m);//左面 l,m 0和2传进去  递归第三层中 l为0,r=2。

第三层中 if(i<r)还是成立,m=(0+2)/2  m这次为零了 ,继续进左递归 sort(l,m);//左面  l,m 0和0传进去 递归第四层 ,l为0,r也为0。if(i<r)不成立,包含的内容不执行,此时递归可算到头了。返回到递归的上一层,执行sort(l,m);//左面  下面的sort(m+1,r);//右边

此层m为2,r为3  m+1,r 作为参数传递给sort(m+1,r);//右边 接着判断然后接着................................................

这里一张流程图概括

 

4、如果递归明白了,就需要我们排序合并。

排序合并排序

void merge(int z,int m,int y)

{  int i=z, j=m+1,k=z;

    while(i<=m&&j<=y)

      if(arr[i]<arr[j])

        arr1[k++]=arr[i++];

    else

       arr1[k++]=arr[j++];

 while(i<=m)

    arr1[k++]=arr[i++];

while(j<=y)

    arr1[k++]=arr[j++];

for(i=z;i<y;i++)

{arr[i]=arr[i];

}}

    因为merge函数是在 sort(l,m)和sort(m+1,r)的下面,然后我们回头看递归中最后一层是哪一层? 是第三层,第三层的 l为0,m为0,r为2带入merge函数中

这里用到了辅助 数组arr1[]来暂时存放通过比较后放入的数据。参数 int z是左 ,int m是中 ,int y是右。

定义变量进行参数的赋值  int i=z, j=m+1,k=z 。

while(i<=m&&j<=y) i从左开始到arr数组中间m , j从中间加一的位置开始到arr数组的右边。

 

if(arr[i]<arr[j]) 开始比较。

小的放前面 2和1 小的放到arr1中。

    arr1[k++]=arr[i++];

    else

    arr1[k++]=arr[j++];    

下面两个while循环是对左右作比后避免出现左右比较数有剩余的情况。

while(i<=m)   

    arr1[k++]=arr[i++];

while(j<=y)

    arr1[k++]=arr[j++];

然后下面的for循环是对arr1数组中暂存的数据再赋值给arr数组中。

for(i=z;i<y;i++)

{arr[i]=arr[i];

}}  

 

这一层的merge执行完成之后回到上一层执行sort(m+1,r)函数内部的内容,然后再次返回上一层。

 

排序归并过程总览图    

根据上图参照的来看,计算机的执行过程大体是这样。                                                                                                                                                        

 

程序代码

#include <iostream>
#include <stdio.h>

using namespace std;
int a[10] = { 2,3,4,1,2,3,1,2,1,5 };
int b[10];
void merge(int a[], int b[], int z, int m, int y) {
	int i = z;
	int j = m + 1;
	int k = z;
	int q;
	while (i <= m && j <= y)
		if (a[i] < a[j])
			b[k++] = a[i++];
		else
			b[k++] = a[j++];

	if (i <= m)
		for (q = i; q <= m; q++)
			b[k++] = a[i++];
	else
		for (q = j; q <= y; q++)
			b[k++] = a[j++];
}
void copy(int a[], int b[], int l, int r)
{
	int i;
	for (i = l; i <= r; i++)
		a[i] = b[i];

}

void sort(int a[], int l, int r)

{
	if (l < r)
	{

		int m = (l + r) / 2;
		sort(a, l, m);
		sort(a, m + 1, r);
		merge(a, b, l, m, r);
		copy(a, b, l, r);
	}
}

int main() {

	sort(a, 0, 9);
	for (int i = 0; i < 10; i++)
		cout<<("%d", a[i]);
}


 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值