算法定义

合并排序是一种递归算法,思路如下:

  • 如果源数组长度为 1,立即返回。
  • 将源数组平分为两个新数组:Left 和 Right。
  • 对 Left 执行递归排序。
  • 对 Right 执行递归排序。
  • 将排序后的 Left 和 Right 执行合并到原数组。

可以看出来,改算法的重点是已排序数组的合并过程。

算法举例

【5,4,3,2,1】

【5,4,3】【2,1】

【5,4】【3】【2,1】

【5】【4】【3】【2,1】

【4,5】【3】【2,1】

【3,4,5】【2,1】

【3,4,5】【2】【1】

【3,4,5】【1,2】

【1,2,3,4,5】

算法实现

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DataStuctureStudy.Sorts
{
class MergeSort<T>
where T : IComparable<T>
{
private static void Swap(T[] items, int left, int right)
{
if (left != right)
{
var temp = items[left];
items[left] = items[right];
items[right] = temp;
}
} public static void Sort(T[] items)
{
if (items.Length < )
{
return;
} int leftSize = items.Length / ;
int rightSize = items.Length - leftSize; T[] left = new T[leftSize];
T[] right = new T[rightSize]; Array.Copy(items, , left, , leftSize);
Array.Copy(items, leftSize, right, , rightSize); Sort(left);
Sort(right);
Merge(items, left, right);
} private static void Merge(T[] items, T[] left, T[] right)
{
var leftIndex = ;
var rightIndex = ; for (var i = ; i < items.Length; i++)
{
if (leftIndex >= left.Length)
{
items[i] = right[rightIndex];
rightIndex++;
}
else if (rightIndex >= right.Length)
{
items[i] = left[leftIndex];
leftIndex++;
}
else if (left[leftIndex].CompareTo(right[rightIndex]) < )
{
items[i] = left[leftIndex];
leftIndex++;
}
else
{
items[i] = right[rightIndex];
rightIndex++;
}
}
}
}
}

合并过程

已排序数组的合并过程比较有意思,分别对 Left 和 Right 维护一个从左到右的指针,分别是:leftIndex 和 RightIndex,当填充目标数组的第 i 个元素时,需要从 Left 和 Right 中找到剩余元素(指针到末尾部分的元素)的最小值,因为是已排序数组,只需比较 Left[LeftIndex] 和 Right[RightIndex] 的大小,将最小的元素填充到目标数组的第 i 个位置即可,然后相应的指针加 1。

算法:合并排序(Merge Sort)的更多相关文章

  1. oracle表连接------&gt;排序合并连接(Merge Sort Join)

    排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景例如以下: a,通常 ...

  2. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  3. 排序算法--希尔排序(Shell Sort)_C#程序实现

    排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...

  4. 排序算法--选择排序(Selection Sort)_C#程序实现

    排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  5. 基础排序算法之并归排序(Merge Sort)

    并归排序是学习分治法 (Merge Sort) 的好例子.而且它相对于选择,插入,冒泡排序来说,算法性能有一定提升.我首先会描述要解决的问题,并给出一个并归排序的例子.之后是算法的思路以及给出伪代码. ...

  6. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  7. STL 源代码剖析 算法 stl_algo.h -- merge sort

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie merge sort ----------------------------------- ...

  8. [算法] 希尔排序 Shell Sort

    希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是: ...

  9. 排序算法 - 选择排序(selection sort)

    选择排序(Selection sort)跟插入排序一样,也是O(n^2)的复杂度,这个排序方式也可以用我们的扑克牌来解释. 概念 桌面上有一堆牌,也是杂乱无章的,现在我们想将牌由小到大排序,如果使用选 ...

  10. js 实现排序算法 -- 归并排序(Merge Sort)

    原文: 十大经典排序算法(动图演示) 归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得 ...

随机推荐

  1. JavaScript中构造函数

    构造函数:函数的另一种执行方法,执行后创建对象,并创建原型对象. 原型链:对象访问构造函数的指针. Function函数:函数对象. Object函数:所有创建对象的祖辈对象,也是由Function对 ...

  2. Asp.Net MVC路由调试工具-RouteDebugger

    1.获取方式 第一种方法: 在程序包控制台中执行命令 PM> Install-Package routedebugger 安装成功后Web.config文件中会自动加入行 <add key ...

  3. LoadRunner 自带订票系统flights 功能空白、1080端口被占用的解决办法

    LoadRunner 自带订票系统flights 功能空白.1080端口被占用的解决办法 安装LoadRunner8.1后运行Mercury Web Tours Application,点击fligh ...

  4. thinkphp3.2路由美化,url简化

    thinkphp的路由功能很实用也很强大,可以简化url,有强大的正则匹配,可以做成任何想要的url样式. 在前台的config.php配置文件中: 1.首先开启路由 1 'URL_ROUTER_ON ...

  5. SQL注入备忘录

    备忘录(一) 拿起小本本记下常考知识点. 常用连接词 and && %23%23 且 or || %7c%7c 或 xor 非 Access 数据库: 只能爆破表名.列名获取数据.无法 ...

  6. 基于五阶段流水线的RISC-V CPU模拟器实现

    RISC-V是源自Berkeley的开源体系结构和指令集标准.这个模拟器实现的是RISC-V Specification 2.2中所规定RV64I指令集,基于标准的五阶段流水线,并且实现了分支预测模块 ...

  7. Win7/Win10下搭建Go语言开发环境

    1 下载适合window版本的Go安装包,下载地址http://code.google.com/p/go/downloads/list 2 下载适合window本本的LiteIDE,下载后解压即可使用 ...

  8. WinForm 使用 NPOI 2.2.1从datatable导出Excel

    最新的NOPI应该是2.3了,但在官网上还是2.2.1. 也是第一次使用NPOI来导出Excel文件. 在写的时候搜不到2.2.1的教程,搜了一个2.2.0的教程. 不过也没什么问题,NPOI是真的方 ...

  9. PHP 笔记——面向对象编程知识点

    类是属性和方法的集合,是面向对象编程方式的核心和基础,通过类可以将零散的用于实现某项功能的代码进行有效管理. 类是由class关键字.类名和成员组成的,类名不区分大小写. 在类中定义常量使用关键字 c ...

  10. Zookeeper的基本操作

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 参考内容: <私塾 ...