归并排序详细步骤

                                              归并排序

递归的函数

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 arr[10]={2,3,4,1,2,3,1,2,1,5};

int arr1[10];

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];

}}

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);

 

}}

int main(){

sort(0,9);

for(int i=0;i<10;i++)

  printf("%d",arr[i]);

}