排序算法之--归并排序(好玩的一个算法o。o)
下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦)
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾。
大家需要注意的是,进行归并操作来实现数组排序的前提是:归并操作两边的数组要都是有序的(所以这里又涉及到了递归的过程,而单单递归好像也没用哦,有用的递归是从小范围开始递归到大范围,所以这里又涉及到了,中分递归)。
了解了这个大题的四路:归并排序其实也不是很难理解了哦。
直接上个图,便于理解:
图片的分解其实就相当于中分递归,后面的合并其实就是归并操作;
先来了解一下归并操作的编程部分:
先定义两个指针,一个指向左边,一个指向中间+1,再定义一个辅助数组help[](说明其空间复杂度为O(N)哦)
来比较一下大小,小的元素放到辅助数组中,并将下标++,直到两个指针有一个为空,跳出,将另外一部分还没放到辅助数组的元素拷贝到辅助数组中去。下面供上流程图:
通俗易懂就是这个:
下面对程序进行分析:
26~30行定义变量和数组
31,32判断有没有越界,没有越界就比较大小,小的放进去,同时辅助数组下标++,比较小的指针也++
37~47则是将将另外一部分还没放到辅助数组的元素拷贝到辅助数组中去。
到这里那我们就直接上程序了哦。
下面就是所谓的中分递归和归并递归了;