博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序算法
阅读量:6988 次
发布时间:2019-06-27

本文共 1421 字,大约阅读时间需要 4 分钟。

合并排序(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;

转载地址:http://buhpl.baihongyu.com/

你可能感兴趣的文章
小白的正则表达式学习之旅-02
查看>>
学习C语言必须知道的理论知识(第三章-数据类型的分类)
查看>>
hdu 素数环
查看>>
H3C CAS 介绍 & 基本概念
查看>>
xxx
查看>>
openSUSE 安装 Caffe
查看>>
你可能没注意的CSS单位
查看>>
咱计算机专业的人,能不能不那么特别地彰显对语文的无知?——再谈面向对象......
查看>>
foreach Transform 同时chils.setParent引起的bug
查看>>
AES加密--适用于RC2、RC4和Blowfish
查看>>
如何强制删除一个apk
查看>>
SHA算法摘要处理
查看>>
[HEOI2012]采花 BZOJ2743
查看>>
Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA
查看>>
【智力题】程序员面试经典
查看>>
mysql命令行
查看>>
myeclipse一些技巧
查看>>
bond网卡绑定(centos6.5 + centos 7)
查看>>
linux搭建主备负载均衡
查看>>
阅读博客——我们应当怎样做需求分析?
查看>>