归并排序的分析与Java实现
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 归并排序算法依赖归并操作。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并排序在众多排序算法中既是稳定排序,效率也比较高,同时,归并排序不仅可以用于内排序,还可以用于外排序。 1.两个有序数列的合并 设两个有序数列放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量 R1中,待合并完成后将 R1 复制回 R[low..high]中。 (1)合并过程 合并过程中,设置 i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置。 合并时依次比较 R[i]和 R[j]的关键字,取关键字较小的记录复制到 R1[p]中,然后将被复制记录的指针 i 或 j 加 1,以及指向复制位置的指针 p 加 1。 重复这一过程直至两个输入的子文件有一个已全部复制完毕,此时将另一非空的子文件中剩余记录依次复制到 R1 中即可。 (2)动态申请 R1 实现时,R1 是动态申请的,因为申请的空间可能很大,所以在工程上应用时,可能需要加入申请空间是否成功的处理。 2.归并排序的实现 (1)二路归并的思路 将数组划均分为两个子数组; 对两个字数组进行排序; 将排序好的两个字数组归并。 所谓 N路归并 是指将数组均分为N个子数组