C# 归并排序

 c# 归并排序

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace Sort  {      class MergeSorter      {          ///           /// 归并排序之归:归并排序入口           ///           /// 无序数组          /// 有序数组           public static int[] Sort(int[] data)          {              //若data为null,或只剩下1 or 0个元素,返回,不排序              if (null == data || data.Length > 1;              //初始化临时数组let,right,并定义result作为最终有序数组,若数组元素奇数个,将把多余的那元素空间预留在right临时数组              int[] left = new int[middle];              int[] right =  new int[data.Length - middle];              int[] result = new int[data.Length];              for (int i = 0; i < data.Length; i++)              {                  if (i < middle)                  {                      left[i] = data[i];                  }                  else                  {                      right[i-middle] = data[i]; //此处i-middle,让我省掉定义一个j,性能有所提高                  }              }              left = Sort(left);//递归左数组              right = Sort(right);//递归右数组              result = Merge(left, right);//开始排序              return result;          }          ///           /// 归并排序之并:排序在这一步          ///           /// 左数组          /// 右数组          /// 合并左右数组排序后返回           private static int[] Merge(int[] a, int[] b)           {              //定义结果数组,用来存储最终结果              int[] result = new int[a.Length + b.Length];              int i = 0, j = 0, k = 0;              while (i < a.Length && j < b.Length)              {                  if (a[i] < b[j])//左数组中元素小于右数组中元素                  {                      result[k++] = a[i++];//将小的那个放到结果数组                  }                  else//左数组中元素大于右数组中元素                  {                      result[k++] = b[j++];//将小的那个放到结果数组                  }              }              while (i < a.Length)//这里其实是还有左元素,但没有右元素               {                  result[k++] = a[i++];              }              while (j < b.Length)//有右元素,无左元素              {                  result[k++] = b[j++];              }              return result;//返回结果数组          }      }  }

归并排序:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

假设我们有一个没有排好序的序列,那么首先我们使用分割的办法将这个序列分割成一个一个已经排好序的子序列,然后再利用归并的方法将一个个的子序列合并成排序好的序列。分割和归并的过程可以看下面的图例。

1055.png

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

如何把两个已经排序好的子序列归并成一个排好序的序列呢?可以参看下面的方法。

假设我们有两个已经排序好的子序列。

序列A:1  23  34  65

序列B:2  13  14  87

那么可以按照下面的步骤将它们归并到一个序列中。

(1)首先设定一个新的数列C[8]。
(2)A[0]和B[0]比较,A[0] = 1,B[0] = 2,A[0] (3)A[1]和B[0]比较,A[1] = 23,B[0] = 2,A[1] > B[0],那么C[1] = 2
(4)A[1]和B[1]比较,A[1] = 23,B[1] = 13,A[1] > B[1],那么C[2] = 13
(5)A[1]和B[2]比较,A[1] = 23,B[2] = 14,A[1] > B[2],那么C[3] = 14
(6)A[1]和B[3]比较,A[1] = 23,B[3] = 87,A[1] (7)A[2]和B[3]比较,A[2] = 34,B[3] = 87,A[2] (8)A[3]和B[3]比较,A[3] = 65,B[3] = 87,A[3] (9)最后将B[3]复制到C中,那么C[7] = 87。归并完成。 

C#移位运算(左移和右移)

归并排序,时间复杂度为O(nlogn)。

归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

以上就是 c# 归并排序的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:18:59
下一篇 2025年12月9日 06:48:16

相关推荐

  • C# 插入排序

    c#  ,插入排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class InsertSorter { public static in…

    2025年12月17日
    000
  • C# 堆排序

    c#  堆排序 using System; using System.Collections; namespace Sort { public class HeapSorter { public static int[] Sort(int[] sortArray) { BuildMaxHeap(so…

    好文分享 2025年12月17日
    000
  • 鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序)

     鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序) using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Sort { class CockTailSorter { p…

    好文分享 2025年12月17日
    000
  • C# 冒泡排序

     c# 冒泡排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class BubbleSorter { public static int…

    好文分享 2025年12月17日
    000
  • 排序算法测试程序入口

     排序算法测试程序入口 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;using System.Diagnostics;namesp…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:.NET知识

    1、什么是.NET Framework    所谓.NET FrameWork就是一个平台,它的目的是为了跨操作系统编程。它包含了很多模块,例如有windows应用程序构件,Web开发的模块等,而不同的操作系统根据自己的特性,支持其中部分模块。NET框架是采用虚拟机运行的编程平台,以通用语言运行时(…

    好文分享 2025年12月17日
    000
  • C#数据类型

        c#的数据类型可以分为3类:数值类型,引用类型,指针类型。指针类型仅在不安全代码中使用。    值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型。引用类型包括类类型,接口类型,代表类型和数组类型。     值类型和引用类型的不同之处是值类型的变量值直接包含数据,而引用类型的…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:C#基础(1)

    c#基本结构 using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class MyFirstClass { static void Main(string[] a…

    好文分享 2025年12月17日
    000
  • C#的隐式和显示类型转换

        关于隐式转换和显示转换,每种语言都有的,c#中当然也不例外。一般常用到的场合,一种是写运算表达式的时候,要保持整体的数据类型一致和计算准确,比如有一个变量a是int型,但是它是通过加减乘除得到的,那么在运算中就要考虑用显示转换,除的运算需要转换成float或double,再把结果强制转换为i…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:C#类和结构(1)

    1、结构功能特性? 实现代码?结构用struct关键字定义的,与类类似,但有本质区别。结构实质是一个值类型,它不需要对分配的。结构的特性:(1)、结构作为参数传递时,是值传递。(2)、结构的构造函数必须带参数的。(3)、结构实例化可以不用new的。(4)、结构不能继承,但是可以实现接口。(5)、结构…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:C#类和结构(2)

      1、什么是构造函数? 有哪些构造函数? 各个构造函数的定义、实现方法、注意事项?所谓构造函数,就是一个方法,这个方法可以初始化对象,即运行完这个函数后,内存总开辟了一块该类的对象的空间。有三种:正常的构造函数,也就是实例化构造函数;私有构造函数;静态构造函数。实例化构造器: public cla…

    2025年12月17日
    000
  • C#中使用gRPC

    由于有nuget,使得c#在配置项目时非常简单。 1. 在NuGet中添加ProtocolBuffer和gRPC引用 protocol buffer 3.0版本,在NuGet插件界面选择Include Prerelease,查找google protocol buffer。如果不选择include …

    好文分享 2025年12月17日
    000
  • C#理解泛型

    简介 Visual C# 2.0 的一个最受期待的(或许也是最让人畏惧)的一个特性就是对于泛型的支持。这篇文章将告诉你泛型用来解决什么样的问题,以及如何使用它们来提高你的代码质量,还有你不必恐惧泛型的原因。 泛型是什么? 很多人觉得泛型很难理解。我相信这是因为他们通常在了解泛型是用来解决什么问题之前…

    好文分享 2025年12月17日
    000
  • C#基础之yield与Singleton

    1.实例解析yiled的作用 最近参加java笔试题第一次见到yield这个关键字,既然遇见了那肯定要掌握,下面是c#中关于yield关键字的总结。yield这个关键字作用于迭代器块中,其最本质的功能有2个:一是“依次”向枚举对象提供值,二是发出迭代结束信号。这两个功能对应的语句分别是yield r…

    2025年12月17日
    000
  • C# 继承

    继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类来定义一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。 当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基…

    好文分享 2025年12月17日
    000
  • C# 多线程经典示例 吃苹果

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解。 示例概述:   下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法。要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈不断削苹果往盘子里面放,老大、老二、老三不断从盘子里面取苹果吃。盘子的大小有限,最多只能放5个苹…

    2025年12月17日
    000
  • C#希尔排序

    c#希尔排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class ShellSorter { public static int[] …

    2025年12月17日 好文分享
    000
  • C# 选择排序

    c# 选择排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class SelectSorter { public static int[…

    2025年12月17日
    000
  • C#编程中的泛型

    .net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持。通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱、拆箱,在一定程度上提升了应用程序的性能。本文将系统地为大家讨论泛型,我们先从理解泛型开始。 1.1 理解泛型 1.1.1 为什么要有泛型? 我想…

    好文分享 2025年12月17日
    000
  • C#的扩展方法解析

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到。 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它父类有非常紧密的依赖…

    好文分享 2025年12月17日
    000

发表回复

登录后才能评论
关注微信