归并排序算法

合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。 

例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并排序算法的操作过程如图7所示: 

初始值 [49] [38] [65] [97] [76] [13] [27] 

看成由长度为1的7个子序列组成 

第一次合并之后 [38 49] [65 97] [13 76] [27] 

看成由长度为1或2的4个子序列组成 

第二次合并之后 [38 49 65 97] [13 27 76] 

看成由长度为4或3的2个子序列组成 

第三次合并之后 [13 27 38 49 65 76 97] 

图6 归并排序算法过程图 

合并算法的核心操作就是将一维数组中前后相邻的两个两个有序序列合并成一个有序序列。合并算法也可以采用递归算法来实现,形式上较为简单,但实用性很差。 

合并算法的合并次数是一个非常重要的量,根据计算当数组中有3到4个元素时,合并次数是2次,当有5到8个元素时,合并次数是3次,当有9到16个元素时,合并次数是4次,按照这一X规律,当有N个子序列时可以推断出合并的次数是X(2 >=N,符合此条件的最小那个X)。 
源程序:
None.gifprogram hebing; 
None.gif const 
None.gif  n=10; 
None.gifvar 
None.gif  a:array[1..n] of integer; 
None.gif  i:integer; 
None.gif 
None.gif procedure init; 
None.gif var 
None.gif    i:integer; 
None.gif begin 
None.gif  for i:=1 to n  do read(a[i]); 
None.gif readln; 
None.gif end; 
None.gif 
None.gif procedure merge(low,mid,high:integer); 
None.gif var 
None.gif h,i,j,k:integer; 
None.gif b:array[1..n] of integer; 
None.gif begin 
None.gif h:=low; i:=low; j:=mid+1; 
None.gif  while (h<=mid) and (j<=high)  do begin 
None.gif  if (a[h]<=a[j]) then begin
None.gif   b[i]:=a[h]; h:=h+1; 
None.gif end  else begin 
None.gif b[i]:=a[j]; j:=j+1; 
None.gif end; 
None.gif i:=i+1; 
None.gif end; 
None.gif 
None.gif  if h>mid then 
None.gif  for k:=j to high  do begin 
None.gif   b[i]:=a[k]; i:=i+1;
None.gif end  else 
None.gif  for k:=h to mid  do begin 
None.gif b[i]:=a[k]; i:=i+1; 
None.gif end; 
None.gif 
None.gif  for k:=low to high  do a[k]:=b[k];
None.gif end; 
None.gif 
None.gif procedure mergesort(low,high:integer); 
None.gif var 
None.gif mid:integer; 
None.gif begin 
None.gif  if low<high then begin 
None.gif mid:=(low+high) div 2; 
None.gif mergesort(low,mid); 
None.gif mergesort(mid+1,high); 
None.gif merge(low,mid,high); 
None.gif end; 
None.gif end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值