2归并排序的代码创建C++版本

第一步–准备工作

第二步-------申请空间,确定临时数组长度

第三步-------分治,将元素一个个独立

第四步—合并

第五步–贴代码

中心思想:
无限分割,分治思想,无限分成左右,分成一个一个的,然后再进行回归合并,进行滚雪球,滚成大的

第一步

在这里插入图片描述
第二步:-------申请空间,确定临时数组长度
**
在这里插入图片描述

第三步:-------分治,将元素一个个独立**
在这里插入图片描述
所以说走到尽头,是两两元素的比较,然后回归一次,形成两个小数组,然后同理回归,数组越来越来

虽然在左右递归的时候,其实还要明白,在每次进行向左半边无限递归的时候,直到尽头终止,然后回归的时候,会进行左半边的数组的相对方向的右半数组进行递归,目的是独立一个个元素,最终会到左半边的初始左半数组,在左半数组回归的时候,会进行调用Merge()函数,目的是进行两两元素的比较。
在这里插入图片描述
这个函数中的,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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值