C语言排序算法之归并排序

排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。

一、实现原理

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中即可。
最后,将结果赋值到R[]中。

(2)动态申请R1

实现时,R1是动态申请的,因为申请的空间可能很大,故须加入申请空间是否成功的处理。

二、2种实现方法

自底向上自顶向下方法。

1. 自底向上方法(虽然效率较高,但可读性较差)

(1) 自底向上的基本思想

自底向上的基本思想是:第1趟归并排序时,将待排序的文件R[1…n]看作是n个长度为1的有序子文件,将这些子文件两两归并,若n为偶数,则得到 n / 2 n/2 n/2 个长度为2的有序子文件;若n为奇数,则最后一个子文件轮空(不参与归并)。故本趟归并完成后,前 l o g ( n ) log(n) l

你可能感兴趣的:(c算法,排序算法)