当前位置: 首页 > news >正文

C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码

1 双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

2 循环链表

循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。

3 归并排序

归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。

其主要算法操作可以分为以下步骤:

  1. 将n个元素分成两个含n/2元素的子序列;
  2. 用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列);
  3. 合并两个已排序好的序列;

易知,MS的关键在于Merge过程。对于这一过程的理解,算法导论中给出了一个形象的模型。
即假设桌面上有两堆已排序好的的牌,且每一堆都正面朝下放置。然后我们分别从两堆牌中选取顶上的一张牌(选取之后,堆顶端又会露出新的顶牌),选取较小的一张,放入输出堆,另一张放回。
重复这一步骤,最后直到一堆牌为空。由于两堆牌都是已排序,所以可知,只要将剩下的那堆牌盖到输出堆即完成整个排序过程。

4 源程序

using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public class DoublyLinkNode{public int Data { get; set; } = 0;public DoublyLinkNode Next { get; set; } = null;public DoublyLinkNode Prev { get; set; } = null;public DoublyLinkNode(int d){Data = d;}}public partial class DoublyLinkedList{public DoublyLinkNode Head { get; set; } = null;private DoublyLinkNode Split(DoublyLinkNode head){DoublyLinkNode fast = head;DoublyLinkNode slow = head;while (fast.Next != null && fast.Next.Next != null){fast = fast.Next.Next;slow = slow.Next;}DoublyLinkNode temp = slow.Next;slow.Next = null;return temp;}private DoublyLinkNode Merge_Utility(DoublyLinkNode first, DoublyLinkNode second){if (first == null){return second;}if (second == null){return first;}if (first.Data < second.Data){first.Next = Merge_Utility(first.Next, second);first.Next.Prev = first;first.Prev = null;return first;}else{second.Next = Merge_Utility(first, second.Next);second.Next.Prev = second;second.Prev = null;return second;}}public DoublyLinkNode Merge_Sort(DoublyLinkNode node){if (node == null || node.Next == null){return node;}DoublyLinkNode second = Split(node);node = Merge_Sort(node);second = Merge_Sort(second);return Merge_Utility(node, second);}public static List<int> ToList(DoublyLinkNode head){List<int> list = new List<int>();while (head != null){list.Add(head.Data);head = head.Next;}return list;}public static string ToHtml(DoublyLinkNode head, DoublyLinkNode cur){StringBuilder sb = new StringBuilder();sb.AppendLine("<style>");sb.AppendLine(".node { float:left;width:45px;height:45px;line-height:45px;font-size:21px;text-align:center;border:solid 1px #DD0000; }");sb.AppendLine(".node_cur { float:left;width:45px;height:45px;line-height:45px;font-size:21px;font-weight:bold;text-align:center;border:solid 1px #FF6701;background-color:#FAFA90; }");sb.AppendLine(".link { float:left;width:45px;height:45px;line-height:21px;font-size:12px;text-align:center;border:solid 0px #DD0000;white-space:nowrap;word-break:keep-all; }");sb.AppendLine("</style>");while (head != null){if (head == cur){sb.AppendLine("<div class='node_cur'>" + head.Data + "</div>");}else{sb.AppendLine("<div class='node'>" + head.Data + "</div>");}if (head.Next != null){sb.AppendLine("<div class='link'>--&gt;<br>&lt;--</div>");}head = head.Next;}return sb.ToString();}}
}

POWER BY 315SOFT.COM

相关文章:

  • SpringBoot+Vue实战:打造企业级项目管理神器
  • 【前端素材】推荐优质后台管理系统 Adminity平台模板(附源码)
  • mysql学习
  • java009 - Java面向对象基础
  • day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)
  • 【Android安全】Windows 环境下载 AOSP 源码
  • Node.js_基础知识(http模块)
  • 【Go 快速入门】协程 | 通道 | select 多路复用 | sync 包
  • 物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)
  • dbpystream:数据服务API开源
  • 详解kubernetes中的Pod生命周期
  • Java中的static
  • 软件测试之风险管理
  • 华为---RSTP(四)---RSTP的保护功能简介和示例配置
  • 通过一篇文章让你了解数据结构和算法的重要性
  • gitlab-ci配置详解(一)
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript设计模式与开发实践系列之策略模式
  • Js基础——数据类型之Null和Undefined
  • Spring Boot MyBatis配置多种数据库
  • webpack4 一点通
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 二维平面内的碰撞检测【一】
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 聊聊sentinel的DegradeSlot
  • 码农张的Bug人生 - 初来乍到
  • 漂亮刷新控件-iOS
  • 三栏布局总结
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 为什么要用IPython/Jupyter?
  • 在Mac OS X上安装 Ruby运行环境
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (+4)2.2UML建模图
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (poj1.3.2)1791(构造法模拟)
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)JAVA中的堆栈
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)程序员技术练级攻略
  • (转载)Linux 多线程条件变量同步
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net MySql
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [AIGC] Java 和 Kotlin 的区别
  • [AutoSar]BSW_Com02 PDU详解