初阶数据结构.排序(1.归并排序)

本节大纲:

1.归并排序的基本思想

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

归并排序的核心步骤如下图所示:(可分为分解和合并)

2.递归版

如上图,为归并排序的递归大体,-MergeSort为归并排序的主要递归方法,由下图进行讲解,

temp为我们创建的第三方数组,在下图的讲解会讲解其作用。

上图为归并排序递归的归并分解加归并方法,现在我们将上图逐步分解为多个步骤来讲解如下:

(1)a为我们需要排序的数组,temp为我们创建的第三方数组,最后面会讲解其作用,begin为a数组的首个元素,end为a数组的位于末尾的元素。

分解:

(2)判断a数组中的元素是否只有一个值,就返回,或者开始就判断该数组是否含有元素,如果没有就返回,大于两个元素,则进行下面的归并排序。

(3)如果【begin,mid】【mid+1,end】有序则可以进行归并了。

(4)对a数组左边进行归并右边也进行一个归并,递归下去,直到有序就可以进行归并。

归并:

(5)对左右两边有序序列进行排序,如果a[bengin1]<=a[begin2],就将a[begin1]放进temp数组中,相反就将a[bengin2]放入temp数组中,这样temp就是一个有序数组。(左边有序数组元素个数和右边数组元素个数可以不同,结束条件如while循环判断条件)

(6)这是当上述两个数组结束比较,其中肯定有一个未结束判断,如果是begin1未结束,则将begin1所在数组数组元素依次放入temp数组,相反将begin2未结束,将其中所在数组的元素依次放入temp数组中。

(7)最后利用memcpy函数来将temp中有序数组拷贝到a数组中,则a数组则为有序数组。

易出错:步骤(3)不能使用【begin,mid-1】【mid,end】

如下图:下图为错误用法造成的后果



3.非递归

非递归大体思想:一一归并,两两归并,四四归并,........

下图为非递归的全部代码,也如递归讲解分为多个步骤进行讲解。

(1)gap为每组归并的数据个数。

(2)【begin1,end1】【begin2,end2】进行归并。

(3)i控制的是每组归并的起始位置。

(4)就是归并,然后拷贝,递归和非递归的归并方法思路一样。

(5)一一归并,然后两两归并,...........,直到每组归并的个数gap等于或大于总数据个数时不需要归并,则结束循环。

(6)如果没有下图代码,则会导致下面展示图的x表示超出范围,越界。

下面两个可以归并为一类:不用归并了

上面一个为一类需要修正一下

(上面两个采用上面一个代码,下面一个采用下面一个代码)

谢谢您的观看,如果感觉对您的理解有帮助,点赞加收藏!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值