数据结构和算法14 之归并排序

简介:

  归并算法的中心是归并两个已经有序的数组。归并两个有序数组A和B,就生成了第三个数组C,数组C包含数组A和B的所有数据项,并且使它们有序的排列在数组C中。首先我们来看看归并的过程,然后看它是如何在排序中使用的。

        假设有两个有序数组,不要求有相同的大小。设数组A有4个数据项,数组B有6个数据项,它们要被归并到数组C中,开始时数组C有10个存储空间,归并过程如下图所示:


        归并排序的思想是把一个数组分成两半,排序每一半。然后用merge方法将数组的两半归并成一个有序的数组。被分的每一半使用递归,再次划分排序,直到得到的子数组只含有一个数据项为止。正如上面所说的,归并排序需要额外的一个和AB两个数组总和相等的空间,如果初始数组几乎沾满了整个存储器,那么归并排序就不能工作了。

        归并排序的思想很简单,下面我们来看看具体实现:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void mergeSort(int[] source) {  
  2.     int[] workSpace = new int[source.length];  
  3.     recMergeSort(source,workSpace, 0, source.length-1);  
  4. }  
  5.   
  6. private void recMergeSort(int[] source, int[] workSpace, int lowerBound, int upperBound) {  
  7.     if(lowerBound == upperBound) {  
  8.         return;  
  9.     }  
  10.     else {  
  11.         int mid = (lowerBound + upperBound) / 2;  
  12.         recMergeSort(source, workSpace, lowerBound, mid); //左边排  
  13.         recMergeSort(source, workSpace, mid+1, upperBound); //右边排  
  14.         merge(source, workSpace, lowerBound, mid+1, upperBound);//归并  
  15.     }  
  16. }  
  17.   
  18. private void merge(int[] a, int[] workSpace, int lowPtr, int highPtr, int upperBound) {  
  19.     int j = 0;  
  20.     int lowerBound = lowPtr;  
  21.     int mid = highPtr - 1;  
  22.     int n = upperBound - lowerBound + 1;  
  23.     while(lowPtr <= mid && highPtr <= upperBound) {  
  24.         if(a[lowPtr] < a[highPtr]) {  
  25.             workSpace[j++] = a[lowPtr++];  
  26.         }  
  27.         else {  
  28.             workSpace[j++] = a[highPtr++];  
  29.         }  
  30.     }  
  31.     while(lowPtr <= mid) {  
  32.         workSpace[j++] = a[lowPtr++];  
  33.     }  
  34.       
  35.     while(highPtr <= upperBound) {  
  36.         workSpace[j++] = a[highPtr++];  
  37.     }  
  38.       
  39.     for(j = 0; j < n; j++) {  
  40.         a[lowerBound + j] = workSpace[j];  
  41.     }  
  42. }  

        算法分析:归并排序的运行时间最差、最好和平均都是O(NlogN),但是它需要额外的存储空间,这在某些内存紧张的机器上会受到限制。归并算法是由分割和归并两部分组成的,对于分各部分,如果我们使用二分查找,时间是O(NlogN),在最后归并的时候时间是O(N),所以总时间是O(NlogN)。空间复杂度为O(N)。

        归并排序是稳定的,由于没有发生数据交换,所有当a=b的时候,a一开始如果在b前面,则其每一次合并后仍然在b前面,故该排序算法是稳定的。

        归并排序就写这么多,如有错误之处,欢迎留言指正~


转载:http://blog.csdn.net/eson_15/article/details/51193139

目录
相关文章
|
1月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
52 9
 算法系列之数据结构-二叉树
|
1月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
62 3
 算法系列之数据结构-Huffman树
|
1月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
79 22
|
2月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
108 29
|
2月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
142 25
|
2月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
104 23
|
3月前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
3月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
92 10
|
3月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
112 2
|
5月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
144 58

热门文章

最新文章