算法:合并排序(Merge Sort)

算法定义

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

  • 如果源数组长度为 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】

算法实现

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace DataStuctureStudy.Sorts
 8 {
 9     class MergeSort<T>
10         where T : IComparable<T>
11     {
12         private static void Swap(T[] items, int left, int right)
13         {
14             if (left != right)
15             {
16                 var temp = items[left];
17                 items[left] = items[right];
18                 items[right] = temp;
19             }
20         }
21 
22         public static void Sort(T[] items)
23         {
24             if (items.Length < 2)
25             {
26                 return;
27             }
28 
29             int leftSize = items.Length / 2;
30             int rightSize = items.Length - leftSize;
31 
32             T[] left = new T[leftSize];
33             T[] right = new T[rightSize];
34 
35             Array.Copy(items, 0, left, 0, leftSize);
36             Array.Copy(items, leftSize, right, 0, rightSize);
37 
38             Sort(left);
39             Sort(right);
40             Merge(items, left, right);
41         }
42 
43         private static void Merge(T[] items, T[] left, T[] right)
44         {
45             var leftIndex = 0;
46             var rightIndex = 0;
47 
48             for (var i = 0; i < items.Length; i++)
49             {
50                 if (leftIndex >= left.Length)
51                 {
52                     items[i] = right[rightIndex];
53                     rightIndex++;
54                 }
55                 else if (rightIndex >= right.Length)
56                 {
57                     items[i] = left[leftIndex];
58                     leftIndex++;
59                 }
60                 else if (left[leftIndex].CompareTo(right[rightIndex]) < 0)
61                 {
62                     items[i] = left[leftIndex];
63                     leftIndex++;
64                 }
65                 else
66                 {
67                     items[i] = right[rightIndex];
68                     rightIndex++;
69                 }
70             }
71         }
72     }
73 }

合并过程

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

 

转载于:https://www.cnblogs.com/happyframework/p/3464645.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 CRISPR 基因编辑技术,人类正在做七件“疯狂”的事

来源&#xff1a;36Kr编译&#xff1a;喜汤很少有哪种现代科学创新能像CRISPR基因编辑技术一样影响深远。有了它&#xff0c;科学家们可以精确地改变任何细胞的DNA。CRISPR技术成为新宠&#xff0c;部分原因是它比早期基因编辑技术更容易使用。尽管CRISPR还没有彻底大展身手&am…

吴恩达作业3:利用深层神经网络实现小猫的分类

利用4层神经网络实现小猫的分类&#xff0c;小猫训练样本是&#xff08;209&#xff0c;64*64*312288&#xff09;,故输入节点是12288个&#xff0c;隐藏层节点依次为20&#xff0c;7&#xff0c;5&#xff0c;输出层为1。 首先看文件路径&#xff0c;dnn_utils_v2.py代码是激活…

A-KAZE论文研读

AKAZE是KAZE的加速版本。KAZE在构建非线性空间的过程中很耗时&#xff0c;在AKAZE中将Fast Explicit Diffusion(FED)加入到金字塔框架可以dramatically speed-up。在描述子方面&#xff0c;AKAZE使用了更高效的Modified Local Difference Binary(M-LDB)&#xff0c;可以从非线性…

和你抢“饭碗”的40家服务机器人企业大盘点!

来源&#xff1a;物联网智库摘要&#xff1a;本文将对国内近40家服务机器人企业进行汇总介绍&#xff0c;所选企业在其相应版块活跃度较高。从三个大类进行了细分盘点。国家机器人联盟&#xff08;IFR&#xff09;根据应用环境将机器人分为了工业机器人和服务机器人。服务机器人…

[问题解决] LaTex Error:Unknown graphics extension:.eps

错误&#xff1a;编译的时候显示:“!LaTex Error:Unknown graphics extension:.eps” 发生场景&#xff1a;Latex写论文 解决方案&#xff1a; latex eps.texdvi2ps eps.dvips2pdf eps.ps转载于:https://www.cnblogs.com/maocaoliu/p/3460956.html

YOLO9000

YOLO9000是YOLO的第三个版本。前两个版本是YOLO v1&#xff0c;YOLO v2&#xff0c;在CVPR2017的文章《Better,Faster,Stronger》中的前半部分都是对前两个版本的介绍&#xff0c;新的内容主要在Stronger部分。YOLO9000中的9000指的是YOLO可以对超过9000种图像进行分类。 Bett…

吴恩达作业4:权重初始化

权重初始化的 正确选择能够有效的避免多层神经网络传播过程中的梯度消失和梯度爆炸问题&#xff0c;下面通过三个初始化的方法来验证&#xff1a; sigmoid导数函数&#xff1a;最大值小于0.25&#xff0c;故经过多层反向传播以后&#xff0c;会导致最初的层&#xff0c;权重无…

使用wireshark抓取3G包

利用wireshark抓3G的包&#xff1a;1、 使用iTools获取手机的唯一识别码&#xff1a;设备标识: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2、 使用数据线将手机连接到mac机&#xff0c;在mac机终端中输入以下命令&#xff1a; rvictl -s xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…

先发制人!Waymo将首推商用载人自动驾驶服务,Uber们怕不怕?

编译&#xff1a;费棋来源&#xff1a;AI科技大本营“真的&#xff0c;真的很难。”11 月举办的一场会议上&#xff0c;Alphabet 旗下 Waymo CEO John Krafcik 对做自动驾驶汽车技术的艰难不无感慨。在他看来&#xff0c;未来几十年内&#xff0c;自动驾驶汽车将一直存在限制&a…

利用ORB/AKAZE特征点进行图像配准

Kp1,kp2都是list类型&#xff0c;两幅图都是500个特征点。这和ORB论文中的数据是一样的。4.4章节 Matches也是list类型&#xff0c;找到325个匹配对。 AKAZE文章中提到一个指标&#xff1a;MS(matching score)# Correct Matches/# Features, 如果overlap area error 小于40%…

吴恩达作业5:正则化和dropout

构建了三层神经网络来验证正则化和dropout对防止过拟合的作用。 首先看数据集&#xff0c;reg_utils.py包含产生数据集函数&#xff0c;前向传播&#xff0c;计算损失值等&#xff0c;代码如下&#xff1a; import numpy as np import matplotlib.pyplot as plt import h5py …

java实现可有括号的android计算器

写了一个android版的计算器&#xff0c;可以计算带括号的表达式&#xff0c;不过前提是&#xff1a;正确的表达式才行小缺陷是没有做表达式括号的控制&#xff0c;现在还没有想到好的控制方式 1 package javaAdvanced;2 3 import java.io.IOException;4 import java.io.PrintWr…

十年之后,数字孪生将这样改变我们的工作与生活

来源&#xff1a;资本实验室数字孪生是近几年兴起的非常前沿的新技术&#xff0c;简单说就是利用物理模型&#xff0c;使用传感器获取数据的仿真过程&#xff0c;在虚拟空间中完成映射&#xff0c;以反映相对应的实体的全生命周期过程。在未来&#xff0c;物理世界中的各种事物…

什么是图像

图像&#xff0c;尤其是数字图像的定义&#xff0c;在冈萨雷斯的书中是一个二维函数f(x,y),x,y是空间平面坐标&#xff0c;幅值f是图像在该点处的灰度或者强度。下面通过OpenCV中最常用的图像表示方法Mat来看一下在计算机中是怎么定义图像的。 Mat的定义 OpenCV在2.0之后改用…

dotNet中初始化器的使用

dotNet中初始化器的使用 2013年12月7日 13:27 有两类初始化器: 对象初始化器和集合初始化器 比如现在有一个User类&#xff1a; Public class User { public int id{get;set;} public string Name{get;set;} public int Age{get;set;} } 对象初始化器&#xff1a; Var u…

吴恩达作业6:梯度检验

梯度检验的目的就是看反向传播过程中的导数有没有较大的误差&#xff0c;首先看Jtheta*x的梯度检验&#xff1a;代码如下 import numpy as np """ Jx*theta的前向传播 """ def forward_propagation(x,theta):Jx*thetareturn J ""&quo…

10年后的计算机会是怎样的?

作者&#xff1a;孙鹏&#xff08;剑桥大学计算机系博士&#xff09;来源&#xff1a;新原理研究所上个世纪三十年代&#xff0c;邱奇和图灵共同提出了通用计算机的概念[1]。在接下来的十多年里&#xff0c;因为战争需要下的国家推动&#xff0c;计算机得以很快从理论发展成为实…

什么是图像变换

还是看OpenCV官方手册&#xff0c;我觉得这样可以同时学习如何使用函数和如何理解一些基本概念。 首先&#xff0c;这里的几何变换geometrical transformations是针对2D图像而言的&#xff0c;不改变图像内容而是将像素网格变形deform the pixel grid&#xff0c;映射到目标图…

MSRA20周年研究趋势文章|图像识别的未来:机遇与挑战并存

文/微软亚洲研究院 代季峰 林思德 郭百宁识别图像对人类来说是件极容易的事情&#xff0c;但是对机器而言&#xff0c;这也经历了漫长岁月。在计算机视觉领域&#xff0c;图像识别这几年的发展突飞猛进。例如&#xff0c;在 PASCAL VOC 物体检测基准测试中&#xff0c;检测器的…

吴恩达作业7:梯度下降优化算法

先说说BatchGD用整个训练样本进行训练得出损失值&#xff0c;SGD是只用一个训练样本训练就得出损失值&#xff0c;GD导致训练慢&#xff0c;SGD导致收敛到最小值不平滑&#xff0c;故引入Mini-batch GD&#xff0c;选取部分样本进行训练得出损失值&#xff0c; 普通梯度下降算…