本节大纲:
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表示超出范围,越界。
下面两个可以归并为一类:不用归并了
上面一个为一类需要修正一下
(上面两个采用上面一个代码,下面一个采用下面一个代码)
谢谢您的观看,如果感觉对您的理解有帮助,点赞加收藏!