归并排序算法

简介:
合并排序(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;
目录
相关文章
|
16天前
|
存储 算法 搜索推荐
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
|
25天前
|
搜索推荐 算法
【数据结构】八大排序之归并排序算法
【数据结构】八大排序之归并排序算法
20 5
|
1月前
|
机器学习/深度学习 算法 搜索推荐
数据结构与算法(Java篇)笔记--归并排序
数据结构与算法(Java篇)笔记--归并排序
|
1月前
|
搜索推荐 算法 Python
python实现归并排序算法。
【2月更文挑战第9天】【2月更文挑战第24篇】python实现归并排序算法。
|
2月前
|
存储 搜索推荐 算法
【数据结构排序算法篇】----归并排序【实战演练】
【数据结构排序算法篇】----归并排序【实战演练】
27 0
|
2月前
|
搜索推荐
排序算法之七:归并排序(非递归)
排序算法之七:归并排序(非递归)
排序算法之七:归并排序(非递归)
|
2月前
|
搜索推荐 C++
【非递归版】归并排序算法(2)
【非递归版】归并排序算法(2)
20 0
|
2月前
|
搜索推荐 算法 C++
【递归版】归并排序算法(1)
【递归版】归并排序算法(1)
22 0
|
3月前
|
搜索推荐 算法
排序算法——归并排序(递归与非递归)
排序算法——归并排序(递归与非递归)
|
3月前
|
搜索推荐
排序算法(归并排序)
讲述了归并排序思想
15 0