归并排序(递归和非递归版本的实现)

归并排序的定义

1.定义

归并排序的实现与逻辑思路

1.递归版本

2.非递归版本

一、归并排序的定义

                                                归并排序

        建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二、归并排序的实现与逻辑思路

                                                1.递归版本

(1)思维推导

归并排序使用递归版本的话,本质上是用二叉树的数据结构实现,这时我们需要先创建一个n个大小的数组,以便放入,然后再将其放入原数组。由上图可知,我们是按左边索引+右边索引然后除二得到要划分的区域,此时不断递归分解便完成了。当我们发现他们索引一旦一样时就直接返回。此时应该10和6并在一起,这时再将其拆分进行比较,然后变成6,10。实际上就是将一个数组分成两份然后比较。那么我们只需创建两个数组的索引,拿10和6来举例。此时因为10左右结点和6的左右结点是相等的,所以直接返回了。此时10的索引为0,6的索引为1,然后将其拆分为两个数组第一个数组开始为0,结束为0,另一个数组则为6的索引,结束也为6的索引。然后将其进行比较放入新的数组中。此时的排序为6 、10。然后再将新数组中放入原数组。此时随着不断递归,排序完毕。
(2).算法实现

2.非递归版本

1.思维过程
我们可以先看其合并的规律,此时分为4等份,而后变成2等份,随便到1,此时可以得出内循环由第一个为4等份,此时我们可以将其分为两个数组,由6和10进行比较的话,此时数组1的索引开始为0,结束为0;数组2为1,结束为1。7和1比较的话,此时数组1的索引来到了2,数组2来到了3,此时我们可以得到支持这个循环需要+2为参数。便可以得到4份数组不同的索引,并按照他们的方式进行比较。但是如果此时来到了10、6、7、1和3、9、4、2归并时我们发现如果按照前方的循环条件+2的话此时是不符合条件的,这时第一个归并的数列10的索引为0,第二个为3,所以不符合条件。这时我们只需将外循环加入一个变量即可。以gap为分割,分割后gap每次乘2,当gap大于数组个数时返回。此时可以得出数组1的索引为内循环中的开始变量i,而结束变量为i+gap-1;数组2的索引开始变量为i+gap,结束变量为i+gap+gap-1。一个一个比较,传入创建的数组中,然后再将其放入原数组。
2.算法实现

我们可以看出这个算法是有问题的,当我们的数组为偶数时可以正常输出,而当为奇数时却输出不了,这时我们需要对其完善。我们先从一个例子开始,当我们用1,6,7,9,4,7,6。我们发现其中1,6和7,9和4,7都可以完成归并,而当到了最后一个数时,我们发现这时begin1和end1时成立的,而begin2和end2却没有找到索引,这时我们可以判断当begin2>数组的长度时直接跳出就可以暂时解决这个问题。这时数组来到第二次分割,这时顺序变成了这时前半段是可以完成归并的。当我们来到4,7,6时,此时begin1和end1时成立的,他们是4和7这个位置。而当我们走到begin2和end2时,我们发现end2超出了数组长度,这时我们也需对其特殊处理,当他超过时,我们要将end2等于数组长度减一。

通过上方条件的特殊处理,这个排序的特殊情况得到了解决,大大加强了代码的完整性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值