归并排序算法

简介:
合并排序(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)。 
源程序:
program hebing; 
const 
  n=10; 
var 
  a:array[1..n] of integer; 
  i:integer; 
 
 procedure init; 
 var 
    i:integer; 
 begin 
  for i:=1 to n  do read(a[i]); 
 readln; 
 end; 
 
 procedure merge(low,mid,high:integer); 
 var 
 h,i,j,k:integer; 
 b:array[1..n] of integer; 
 begin 
 h:=low; i:=low; j:=mid+1; 
  while (h<=mid) and (j<=high)  do begin 
  if (a[h]<=a[j]) then begin
   b[i]:=a[h]; h:=h+1; 
 end  else begin 
 b[i]:=a[j]; j:=j+1; 
 end; 
 i:=i+1; 
 end; 
 
  if h>mid then 
  for k:=j to high  do begin 
   b[i]:=a[k]; i:=i+1;
 end  else 
  for k:=h to mid  do begin 
 b[i]:=a[k]; i:=i+1; 
 end; 
 
  for k:=low to high  do a[k]:=b[k];
 end; 
 
 procedure mergesort(low,high:integer); 
 var 
 mid:integer; 
 begin 
  if low<high then begin 
 mid:=(low+high) div 2; 
 mergesort(low,mid); 
 mergesort(mid+1,high); 
 merge(low,mid,high); 
 end; 
 end;
目录
相关文章
|
1月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
23 1
|
1月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
72 0
|
1月前
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
20 0
|
3月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
42 0
|
3月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
42 0
|
4月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
76 4
|
4月前
|
算法 搜索推荐 C#
|
5月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
37 0
|
5月前
|
搜索推荐 算法
【C/排序算法】:归并排序和计数排序
【C/排序算法】:归并排序和计数排序
40 0