C# 排序算法5:归并排序
归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。该算法是采用分治法。
原理:
  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:归并排序的更多相关文章
- Java常见排序算法之归并排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - 【排序算法】归并排序算法 Java实现
		
归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 基本思想 可以将一组数组分成A,B两组 依次类推,当分出来的小组只有一 ...
 - 【DS】排序算法之归并排序(Merge Sort)
		
一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...
 - 排序算法之归并排序(Mergesort)解析
		
转自:http://www.cnblogs.com/ayqy/p/4050452.html 一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧: 归并排序的效率达 ...
 - 我的Java开发学习之旅------>Java经典排序算法之归并排序
		
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...
 - 我的Java开发学习之旅------>Java经典排序算法之归并排序
		
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...
 - C++编程练习(15)----“排序算法 之 归并排序“
		
归并排序 归并排序(Merging Sort)的原理: 假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为1,然后两两归并,得到 [n/2] ([ x ] 表示不小于 ...
 - Java排序算法之归并排序
		
基本思想: 归并排序利用分治法,先将一个序列分成一个个子序列,然后对子序列进行排序,再把有序子序列合并为整体有序序列. 图片来自于http://www.cnblogs.com/shudonghe/p/ ...
 - 数据结构与算法之PHP排序算法(归并排序)
		
一.基本思想 归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,使每个子序列有序,再将已有序的子序列合并,得到完全有序的序列.该算法是采用分治法(Divid ...
 - js排序算法04——归并排序
		
归并排序是一种分治算法.思想是把原数组切分成较小的数组,直到每个小数组只有一个位置,再将小数组归并成较大的数组,直到最后有一个完整有序的大数组. js实现如下: function mergeSort( ...
 
随机推荐
- SpringBoot-Validate优雅的实现参数校验,详细示例~
			
1.是什么? 它简化了 Java Bean Validation 的集成.Java Bean Validation 通过 JSR 380,也称为 Bean Validation 2.0,是一种标准化的 ...
 - Elasticsearch入门到进阶
			
Elasticsearch 一.Elasticsearch 是什么(中文官网)? Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本.数字.地理空间.结构化和非结构化数据 ...
 - 华企盾DSC启动服务器提示“发生系统错误5”
			
解决方法:没有管理员权限 导致,需要以管理员权限运行服务器安装包,覆盖安装一下
 - 当一名阿里P9是什么样的体验?
			
今天斗胆来跟大家分享一下作为一位阿里的P9是什么样的体验? 首先还是简单给大家介绍一下阿里的p9是属于一个什么样的层级?阿里p9中文名称叫做资深技术专家,一般大概带的团队有从几十人到一两百号人不等,具 ...
 - modeless dialog in html
			
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8& ...
 - 扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐
			
jQuery.i18n.properties 是 jQuery 老项目的国际化框架,其实国际化方案本质上都大同小异,都是需要用翻译函数包裹词条,然后根据词条文件来进行翻译 就是使用上与其他框架不太一样 ...
 - 解决QObject::moveToThread: Current thread (0x56059f9b0f70) is not the object's t
			
对 opencv 降级 pip install opencv-python==4.1.2.30
 - C++中自定义结构体或类作为关联容器的键
			
目录 1. 概述 2. 实例 1. 概述 STL中像set和map这样的容器是通过红黑树来实现的,插入到容器中的对象是顺序存放的,采用这样的方式是非常便于查找的,查找效率能够达到O(log n).所以 ...
 - 解读Java内存模型中Happens-Before的8个原则
			
摘要:本文我们就结合案例程序来说明Java内存模型中的Happens-Before原则. 本文分享自华为云社区<[高并发]一文秒懂Happens-Before原则>,作者: 冰 河. 在正 ...
 - 华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案
			
摘要:企业数字化转型如火如荼,云成为数字化与新基建的关键要素,数据成为智能时代新的生产资料和企业数字化的生命,而数据库则是支撑数据生命线的底座. 本文分享自华为云社区<华为中国生态大会2021举 ...