第一步–准备工作
第二步-------申请空间,确定临时数组长度
第三步-------分治,将元素一个个独立
第四步—合并
第五步–贴代码
中心思想:
无限分割,分治思想,无限分成左右,分成一个一个的,然后再进行回归合并,进行滚雪球,滚成大的
第一步
第二步:-------申请空间,确定临时数组长度
**
第三步:-------分治,将元素一个个独立**
所以说走到尽头,是两两元素的比较,然后回归一次,形成两个小数组,然后同理回归,数组越来越来
虽然在左右递归的时候,其实还要明白,在每次进行向左半边无限递归的时候,直到尽头终止,然后回归的时候,会进行左半边的数组的相对方向的右半数组进行递归,目的是独立一个个元素,最终会到左半边的初始左半数组,在左半数组回归的时候,会进行调用Merge()函数,目的是进行两两元素的比较。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210605200039205.png)
这个函数中的,left,right参数值会在左右递归的时候,左右半的值赋予进行元素元素之间比较和组内元素比较,但是在上边两个递归完成后,会进行原数组的左右两个大的半数组(组内元素)进行比较,此时left和right是原数组的起始位置和尾巴位置,
在此之前,左右两个递归已经将数组的左右两个数组进行有序排序啦。
第四步—合并(首先是元素之间比较,然后是两两组之间的组内元素进行比较,小的元素放前)
**贴代码==============================================**
#include "stdafx.h"
//这是合并的过程---天人合一===如同滚雪球越滚越大的数组
//left表示数组a[]起始位置,right表示尾,mid 表示每次分割的中间
void Merge(int a[],int temp[],int left,int mid,int right)
{ //left赋给数组temp[] 初始位置
int t_postion=left;
//left_start_postion
int ls_pos=left;
//right_start_postion
int rs_pos=mid+1;
while(ls_pos <= mid && rs_pos <= right)
{//左右两个数组的元素谁小谁给临时数组
//这里的左右数组是相对的,因为每次都进行左右分割,故左右
if(a[ls_pos] < a[rs_pos])
temp[t_postion++]=a[ls_pos++];
else
temp[t_postion++]=a[rs_pos++];
}
//如果两个待比较的数组长度不同,必然会有一个没比较完的
//那么需要将未比较的放入到临时数组中,待下一次比较
while(ls_pos <= mid)//情况一,可能mid左边少
temp[t_postion++]=a[ls_pos++];
while(rs_pos <= right)//情况二,可能mid右边边少
temp[t_postion++]=a[rs_pos++];
while(left<=right)//复给原数组,还原
{
a[left]=temp[left];
left++;
}
}
//这是一个分治的过程,目的是让每个元素独立分开
void Msort(int a[],int temp[],int left,int right)
{ //分治的时候,是将中间mid位置元素划分到左半边的
//这是一个整除的过程
//简单说mid值是截取的,不是四舍五入得到
if(left<right){//这个终止条件不能遗漏,很vital
int mid=(left+right)/2;
//递归左半边
Msort(a,temp,left,mid);
//--目的就是将原来的整个数组左大半
//进行元素一个个分离开成单独一个个元素
//------------------------------------------
//递归右半边
Msort(a,temp,mid+1,right);
// --目的就是将原来的整个数组右大半
//进行元素一个个分离开成单独一个个元素
Merge(a,temp,left,mid,right);
}
}
void MergeSort(int a[],int n){
//申请空间,确定数组长度
int *temp=new int[n];
//数组元素分离成单独数组
Msort(a,temp,0,n-1);
delete temp[];
}
int main(int argc, char* argv[])
//理解不了递归的思想,就看不懂了,也理解不透彻的
{//总的思想是先分治,再归并
int a[]={5,6,1,2,8,9,3,4,7};
int n=9;
cout<<endl<<"原始数组"<<endl;
for(int k=0;k<n;k++)
cout<<a[k]<<" ";
cout<<endl<<"比较后"<<endl;
MergeSort(a, n);
for(int kk=0;kk<n;kk++)
cout<<a[kk]<<" ";
cout<<endl;
return 0;
}