归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。该算法是采用分治法。

原理:

  1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4.重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾

图示:

上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。

   static int[] MergeSort(int[] arr,int lowIndex,int highIndex)
{
//子表的长度大于1,则进入下面的递归处理
if (lowIndex <highIndex)
{
//分割位点midIndex
int midIndex = (lowIndex + highIndex) / 2; //递归划分二部分 (arr[lowIndex].....arr[midIndex]) 、 (arr[midIndex+1].....arr[high])
MergeSort(arr, lowIndex, midIndex);
MergeSort(arr, midIndex + 1, highIndex);
//归并
Merge(arr, lowIndex, midIndex, highIndex); } return arr; }
//归并排序的核心部分:将两个有序的左右子表(以midIndex区分),合并成一个有序的表
private static int[] Merge(int[]arr,int lowIndex,int midIndex,int highIndex)
{
//左侧A子表 lowIndex....midIndex 右侧B子表 midIndex+1....highIndex
int[] tempArr = new int[arr.Length];
int tempIndex = 0;
int indexA = lowIndex, indexB = midIndex + 1;
//左右表同时遍历比较 ,如果其中有一个子表遍历完,则跳出循环
while (indexA<=midIndex && indexB <=highIndex)
{
tempArr[tempIndex++] = (arr[indexA] <= arr[indexB] ? arr[indexA++] : arr[indexB++]); }
//左表遍历完,右表还有数据,将右表剩余数,放入tempArr中
while(indexB<=highIndex)
{
tempArr[tempIndex++] = arr[indexB++];
}
//右表遍历完,左表还有数据,将左表剩余数,放入tempArr中
while (indexA <= midIndex)
{
tempArr[tempIndex++] = arr[indexA++];
} //将暂存数组中有序的数列写入目标数组的制定位置,使进行归并的数组段有序
tempIndex = 0;
for (int i = lowIndex; i <=highIndex ; i++)
{
arr[i] = tempArr[tempIndex++];
}
return arr;
}

运行结果

   Console.WriteLine($"数据算法");

            var arr1 = GetArrayData(20, 1,22);
Console.WriteLine($"生成未排序数据arr1:{ShowArray(arr1)}"); var arr7 = MergeSort(arr1,0,arr1.Length-1);
Console.WriteLine($"归并排序arr7:{ShowArray(arr7)}");

C# 排序算法5:归并排序的更多相关文章

  1. Java常见排序算法之归并排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. 【排序算法】归并排序算法 Java实现

    归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 基本思想 可以将一组数组分成A,B两组 依次类推,当分出来的小组只有一 ...

  3. 【DS】排序算法之归并排序(Merge Sort)

    一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...

  4. 排序算法之归并排序(Mergesort)解析

    转自:http://www.cnblogs.com/ayqy/p/4050452.html   一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧: 归并排序的效率达 ...

  5. 我的Java开发学习之旅------>Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...

  6. 我的Java开发学习之旅------&gt;Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...

  7. C++编程练习(15)----“排序算法 之 归并排序“

    归并排序 归并排序(Merging Sort)的原理: 假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为1,然后两两归并,得到 [n/2] ([ x ] 表示不小于 ...

  8. Java排序算法之归并排序

    基本思想: 归并排序利用分治法,先将一个序列分成一个个子序列,然后对子序列进行排序,再把有序子序列合并为整体有序序列. 图片来自于http://www.cnblogs.com/shudonghe/p/ ...

  9. 数据结构与算法之PHP排序算法(归并排序)

    一.基本思想 归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,使每个子序列有序,再将已有序的子序列合并,得到完全有序的序列.该算法是采用分治法(Divid ...

  10. js排序算法04——归并排序

    归并排序是一种分治算法.思想是把原数组切分成较小的数组,直到每个小数组只有一个位置,再将小数组归并成较大的数组,直到最后有一个完整有序的大数组. js实现如下: function mergeSort( ...

随机推荐

  1. [ARC122D] XOR Game

    Problem Statement There are $2N$ integers written on a blackboard. The $i$-th integer is $A_i$. Alic ...

  2. [ABC248G] GCD cost on the tree

    Problem Statement You are given an undirected tree with $N$ vertices. Let us call the vertices Verte ...

  3. hdu4365 Palindrome graph

    Palindrome graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. 现代 CPU 技术发展

    介绍 这篇文章主要是介绍CPU技术的发展,包括最近几十年CPU性能提升和半导体工艺发展,当前技术发展方向.希望可以帮助软件开发者理解CPU指令集和组成运行原理.CPU性能提升的现状和瓶颈.CPU技术发 ...

  5. jenkins安装部署、主从架构、slave镜像、K8S对接

    介绍 CI/CD工具,自动化持续集成和持续部署,用于构建各种自动化任务. 官方提供了docker镜像https://hub.docker.com/r/jenkins/jenkins 使用Deploym ...

  6. auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献

      C++作为一门静态类型语言,是需要程序员声明变量类型的.然而来到了C++11,auto的诞生使得变量声明变得及为方便,尤其是对于比较长的模板类型,auto一定程度上为代码编写者减轻了负担.到了C+ ...

  7. ASR项目实战-决策点

    针对语音识别的产品,分别记录设计.开发过程中的决策点. 实时语音识别 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果. 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时 ...

  8. 川普真会说中文?连嘴型都同步,用VideoReTalking一键生成你的AI播报员

    你能想到这种画面吗?霉霉在节目中用普通话接受采访,特朗普在老家用中文脱口秀,蔡明老师操着一口流利的英文调侃潘长江老师.. 这听起来似乎很魔幻,可如今全部由VideoReTalking实现了 你只需要传 ...

  9. Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据

    太长不看版: Hub 上有不少数据集没有语言元数据,我们用机器学习来检测其语言,并使用 librarian-bots 自动向这些数据集提 PR 以添加其语言元数据. Hugging Face Hub ...

  10. Dart 3.2 更新盘点

    作者 / Kevin Moore 和 Michael Thomsen 我们隆重宣布推出 Dart 3.2,这一版本针对以下方面做出了改进: 新增了一项语言功能,可对私有 final 字段进行非空升级: ...