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

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

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

相关文章

用来检查 CUDA、Conda 和 PyTorch 的版本的python文件

提供的 Python 代码片段包括几个语句&#xff0c;用来检查 CUDA、Conda 和 PyTorch 的版本&#xff0c;以及一些与 CUDA 相关的系统配置。让我们分解一下&#xff1a;PyTorch 版本和配置&#xff1a;torch.__config__.show()&#xff1a;显示 PyTorch 的构建配置。 torch.__ver…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

基于单片机负载控制的无人机电气设备监测系统设计

摘要:为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机…

nftables 测试一拒绝所有流量

要配置 nftables 先拒绝所有流量&#xff0c;然后再添加允许的规则&#xff0c;您可以按照以下步骤操作&#xff1a; 创建一个空的 nftables 配置文件&#xff08;例如 /etc/nftables.conf&#xff09;并添加如下内容&#xff1a; flush rulesettable inet filter {chain input…

Java学习—Stream流

Java 8引入的Stream API是对集合操作的一种高级抽象。Stream API不仅使代码更加简洁易读&#xff0c;还引入了函数式编程的强大功能&#xff0c;使得对集合的操作更加灵活和强大。让我们更详细地探讨Stream的核心概念、操作以及它在实际编程中的应用。 核心概念 Stream&#…

王者荣耀,急于补齐内容短板

问十个人&#xff0c;有九个人知道《王者荣耀》&#xff1b;但如果再问十个知道《王者荣耀》的人&#xff0c;这款游戏到底讲了一个什么故事&#xff0c;每个角色又有怎样的背景&#xff0c;可能十个人都不知道。 整个新年档口&#xff0c;《王者荣耀》都很忙碌。 1月&#x…

《HelloGitHub》第 95 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后&#xff0c;点击‘测试连接’&#xff0c;若提示成功&#xff0c;则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数&#xff1a; mail.catchall.alias: 收件服…

Vue页面更新后刷新页面不会渲染解决

小编今天犯了个很低级的错误&#xff0c;导致VUE页面刷新样式不会更新的问题&#xff01; 解决方法&#xff1a;查看你的路由路径大小写是否正确&#xff01;小编是犯了这种错误&#xff0c;特此分享下&#xff01;

Linux中docker项目提示No such file or directory

本来以为是文件权限问题&#xff0c;后来发现是个非常蠢的问题 文件没有映射到容器中 docker文件映射语法 Docker 使用 -v 或 --volume 参数来指定文件映射。 增加在运行命令后 -v <宿主机目录>:<容器目录> 其中&#xff0c;宿主机目录 是指要映射的宿主机上的…

【Django】执行查询—创建和修改对象

创建对象和修改对象 直接上例子&#xff1a; # 创建对象 >>> from blog.models import Blog >>> b Blog(name"Beatles Blog", tagline"All the latest Beatles news.") >>> b.save() # 修改对象 >>> b5.name &quo…

任务创建后只执行后创建的任务,不进行调度?

1、问题说明 通过HAL创建STM32裸机程序后&#xff0c;移植FreeRTOS程序且编译不报错。创建了两个串口打印的任务&#xff0c;却只有后创建的任务运行&#xff0c;不会进行任务间的调度。 主要代码&#xff1a; /**功能&#xff1a;将C库printf函数重定向到USART1*参数&#x…

oracle 数据库建集群式数据库的DBLINK的语法

根据需要修改以下红色字体的部分即可。 1、连接集群式数据库DBLINK语法 create public database link 自定义的dblink名字 connect to 连接对方数据库的用户名 identified by "密码" using (DESCRIPTION (ADDRESS_LIST (FAILOVER ON) (LOAD_BALANCE OFF) …

ROS 2基础概念#2:节点(Node)| ROS 2学习笔记

ROS 2节点简介 节点是执行计算的进程。节点组合在一起形成一个图&#xff08;graph&#xff09;&#xff0c;并使用主题&#xff08;topic&#xff09;、服务&#xff08;service&#xff09;和参数服务器&#xff08;paramter server&#xff09;相互通信。这些节点旨在以细粒…

进制转换md5绕过 [安洵杯 2019]easy_web1

打开题目 在查看url的时候得到了一串类似编码的东西&#xff0c;源码那里也是一堆base64&#xff0c;但是转换成图片就是网页上我们看见的那个表情包 ?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 我们可以先试把前面的img那串解码了 解码的时候发现长度不够&#xff0c;那我们…

博弈论---Nim游戏(公平组合游戏,概念,证明异或为0就是必败态,示例)

目录 概念&#xff1a; 公平组合游戏ICG 有向图游戏 Nim游戏 先手&#xff09;必胜状态 先手&#xff09;必败状态 如何确定先手是否必胜或者必败&#xff08;都采用最优策略&#xff09; 证明&#xff1a;全部异或为0则是必败状态 综上&#xff1a; 例子 概念&#…

babylonjs入门-基础模版+调试GUI

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 ​ 懒得打字&#xff0c;粘贴复制一气呵成

linux系统---LNMP架构下部署Discuz社区论坛与Wordpress博客

目录 一、编译安装Nginx 1、关闭防火墙 2、安装依赖包 3、创建运行用户 4、压缩软件包并编译安装 5、软链接路径优化 ​编辑 6、添加Nginx系统服务 二.编译安装MySQL服务 1.安装依赖环境 ​编辑 2、创建运行用户 3、编译安装 ​编辑 4、修改mysql 配置文件 5、…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示&#xff0c;用户网络 1 通过 LSW1 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数&#xff0c;对 VLAN2 进…

Go语言公开库与私有库及版本控制

公开库与私有库 go mod除了用作模块化开发之外&#xff0c;也是新版本go源码库的私有与共有的重要途径。 module gitee.com/xvwen/gocmd/cwgogengo 1.21.5在go mod中module的名称规定了该源码是否共有&#xff0c;如果该名称与远程git仓库地址一致&#xff0c;则该源码可以通…