一:概念
归并排序(英文为Merge sort ): 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
----------------------------------------------------------------------------------------------------------------------
归并操作(merge):也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
归并操作的过程如下:
1. 申请空间S,使其大小为两个已经排序序列A、B之和,该空间用来存放合并A、B后的序列
2. 设定两个指针,最初位置分别为序列A、B的起始位置
3. 比较两个指针所指向的元素,选择相对较小的元素放入到空间S,并移动指针到下一个位置
4. 重复步骤3直到某一指针达到序列尾
5. 将另一序列剩下的所有元素直接复制到合并序列尾
----------------------------------------------------------------------------------------------------------------------
二:原理
分治法分以下三个步骤:
– Divide:划分问题转化(多个)为“简单”版的自己(子问题)。
– Conquer:使用相同的方法(通常是递归)解决每一个(子)问题
– Combine:结合的“简单”版本的结果,形成最终的解决方案。
归并排序可分以下三个步骤:
1. Sort the first half using merge sort. (recursive!)
2. Sort the second half using merge sort. (recursive!)
3. Merge the two sorted halves to obtain thefinal sorted array.
原理:把原始数组分成若干子数组,对每一个子数组进行排序,继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组
流程图:
三:特点
· Stable --稳定性
· O(n) extra space for arrays (as shown) --数组 空间复杂度O(n)
· O(lg(n)) extra space for linked lists --链表 空间复杂度O(lg(n))
· O(n·lg(n)) time --时间复杂度O(n*log(n))
· Not adaptive
· Does not require random access to data --不需要随机访问数据
四:JAVA如何实现归并排序
import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort t = new MergeSort(); int[] arrays = {1,8,5,7,9,2,5}; int[] a = t.mergeSort(arrays); System.out.println(Arrays.toString(a)); } /** * @param array 其元素都是有效的整数(不为null) * @return 返回数组,数组按升序排序(低到高) */ public int[] mergeSort(int array[]) { // 如果数组元素有多个(大于1),则进行归并操作 if(array.length > 1) { //初始化两个子数组的大小 int elementsInA1 = array.length / 2; //子数组2的大小 = (array.length&1)==1? array.length/2 : array.length/2+1; //int elementsInA2 = array.length - elementsInA1; (同下) int elementsInA2 = (array.length&1)==1? elementsInA1+1 : elementsInA1; //声明和初始化两个子数组 int arr1[] = new int[elementsInA1]; int arr2[] = new int[elementsInA2]; //对两个子数组进行赋值 arr1 = Arrays.copyOfRange(array, 0, elementsInA1); arr2 = Arrays.copyOfRange(array, elementsInA1,elementsInA1 + elementsInA2); //递归进行归并排序操作(递归函数调用) arr1 = mergeSort(arr1); arr2 = mergeSort(arr2); //-------------------------排序代码块【start】------------------------------- //定义三个变量 // [i] -- 参数数组array的索引 // [j] -- 子数组arr1中正在比较的元素的索引 // [k] -- 子数组arr2中正在比较的元素的索引 int i = 0, j = 0, k = 0; //下面的循环将一直运行,直到有一个子数组中的变空 while(arr1.length != j && arr2.length != k){ if(arr1[j] < arr2[k]){ //复制到最终的数组 array[i] = arr1[j]; i++; j++; }else{ array[i] = arr2[k]; i++; k++; } } //走到这,子数组中的一个已经被用尽,它已没有元素进行比较。这意味着剩下的数组中的元素 //都是最高的(已排序),所以可以把它复制到最终的数组。 while(arr1.length != j){ array[i] = arr1[j]; i++; j++; } while(arr2.length != k){ array[i] = arr2[k]; i++; k++; } //-------------------------排序代码块【end】------------------------------- } //返回已经排序的数组 return array; } }
四:算法复杂度
归并排序的最好、最坏和平均时间复杂度都是O(nlogn),而空间复杂度是O(n),比较次数介于(nlogn)/2和(nlogn)-n+1,赋值操作的次数是(2nlogn)。因此可以看出,归并排序算法比较占用内存,但却是效率高且稳定的排序算法
参考资料:
http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
http://www.cnblogs.com/kkun/archive/2011/11/23/merge_sort.html
http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/mergeSort.htm
http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Merge_sort
http://www.cs.cmu.edu/~15110-f12/Unit05PtC-handout.pdf
http://www.roseindia.net/java/beginners/arrayexamples/mergeSort.shtml
http://www.mycstutorials.com/articles/sorting/mergesort
http://www.vogella.com/tutorials/JavaAlgorithmsMergesort/article.html
http://blog.csdn.net/chenhuajie123/article/details/9296359
相关推荐
### C++排序算法之归并排序源码解析 #### 归并排序简介 归并排序是一种高效的、基于分治策略的排序算法。它利用了分而治之的思想,通过递归地将数组分成越来越小的部分,然后将这些部分重新合并为更大的、已排序的...
python python_十大排序算法之归并排序
归并排序(Merge Sort)是一种非常有效的排序算法,尤其在处理大量数据时表现出良好的稳定性和效率。 归并排序的基本思想源于分治法,即将大问题分解为小问题来解决。在归并排序中,我们首先将待排序的序列拆分为两...
归并排序是一种稳定的排序算法,同样基于分治法。它将数组分成两半,递归地排序每一半,然后将两个已排序的半数组合并成一个有序数组。 #### Java 实现代码分析 `Project17_Merge` 类展示了归并排序的实现。其关键...
归并排序是一种基于分治策略的排序算法,它将大问题分解为小问题来解决,然后将小问题的结果合并以得到最终的解。在C语言中实现归并排序,主要涉及以下几个关键点: 1. **归并排序原理**: 归并排序的基本思想是将...
2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...
Hoare在1960年提出,是目前应用最广泛的排序算法之一。它采用分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...
根据给定的文件信息,我们可以总结出以下关于“C经典算法之合并排序法”的相关知识点: ### 一、概述 本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种...
归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 #### 二、归并排序的基本步骤 归并排序主要由两个关键步骤组成: ...
冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序。如果前一个元素大于后一个元素,它们就会交换位置,这样最大的元素会逐渐"冒泡"到序列末尾。时间复杂度为O(n^2)。 2...
归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。归并排序在实际应用中非常广泛,尤其在处理大...
- 归并排序是基于分治策略的排序算法,它将大问题分解成小问题,然后分别解决,最后再合并这些小问题的解。 - 将数组分为两半,对每一半进行排序,然后将两个已排序的半部分合并成一个完整的有序数组。 - 归并...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法,由计算机科学家John W. Backus于1945年提出。它的工作原理可以分为三个主要步骤:分解、解决和合并。 1. 分解:将原始数据序列分成两个相等(或接近相等...
在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
归并排序是一种高效的、稳定的排序算法,由著名计算机科学家John W. Backus在1946年提出。它是基于分治策略的一种经典算法,适用于处理大量数据。在本系列的第一部分,我们将深入探讨归并排序的基本原理、实现过程...
各种常用c++排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等
**快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...