归并排序是建立在归并操作上的一种有效的排序算法,将两个(或两个以上)有序表合并成一个新的有序表。采用分治法,分而治之:分就是将待排序序列分为若干个有序的子序列,每个子序列是有序;合就是把有序的子序列合并为整体有序序列。
这个算法的基本操作是合并两个已排序的表,因为这两个表是已排序的,所以若将输出放到第三个表中时,则该算法可以通过对输入数据一趟排序来完成。将两个有序表合并成一个有序表,成为2-路归并。可知归的前提是子序列是排序好的,我们可以把整体序列递归地分割成一个一个的子序列,当子序列中仅有一个元素时,该子序列自然就是已排序好,然后再不断的进行2-路归并,最终得到整体有序序列。
下面用图演示这一过程
需要说明的是,上面的分割是意识形态的,和前面介绍的堆排序类似,并不是实际的分割,分割过程中,元素在序列中的位置不变,我们仍可以通过数组索引定位元素。
从上面的图解很容易得知,“2-路分割”和 2-路合并,首先需要将整体无序序列进行递归“2-路分割”,直至分割达到有序状态即子序列仅一个元素(这也是递归的终止条件),然后就是合并,将子序列从小到大放入额外暂存单元中,全部归并完毕,这个暂存单元中的元素就是有序的。