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

news/2024/5/17 15:26:32 标签: 链表, 算法, list, 数据结构, 归并排序

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.niftyadmin.cn/n/5399207.html

相关文章

IO-DAY1

1.用fprintf将链表数据保存到文件中 2用fscanf将文件中数据写入链表 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> typedef int datatype; typedef struct link_list { union { int len; d…

R语言数学建模(二)—— tidymodels

R语言数学建模&#xff08;二&#xff09;—— tidymodels 文章目录 R语言数学建模&#xff08;二&#xff09;—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …

Apache Paimon Spark引擎解析

1.环境准备 Paimon 当前支持 Spark 3.5, 3.4, 3.3, 3.2 和 3.1&#xff0c;为体验更好的功能&#xff0c;建议使用最新的 Spark 版本。 Version Jar Spark 3.5 paimon-spark-3.5-0.7.0-incubating.jar Spark 3.4 paimon-spark-3.4-0.7.0-incubating.jar Spark 3.3…

【JavaSE】String的构造

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 文章目录 目录 系列文章目录 文章目录 前言 一、…

【Javascript】设计模式之策略模式

文章目录 1、使用策略模式计算奖金2、JavaScript 版本的策略模式3、应用&#xff1a;表单验证3.1 用策略模式进行表单验证3.2 给某个文本输入框添加多种校验规则 4、策略模式的优缺点 策略模式的定义是&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0…

Flutter 处理异步操作并根据异步操作状态动态构建界面的方法FutureBuilder

概述 当界面的内容需要依靠网络请求的数据&#xff0c;就需要处理苦恼的&#xff0c;状态是空&#xff0c;非空的逻辑了&#xff0c;不然页面构建可能会报错&#xff0c;而FutureBuilder提供了一个非常好的解决方法&#xff0c;直接看代码 代码 异步操作函数 即网络请求函数…

华为OD技术面试案例6-2024年

个人情况&#xff1a;西电本&#xff0c;二战某985基本寄了。知识储备方面&#xff1a;无任何408基础&#xff0c;学校开过数据结构课程60分过&#xff0c;python纯靠自学&#xff0c;无任何刷题经验&#xff0c;无项目经验&#xff0c;简历东拼西凑。 大概是12月底和OD联系&a…

nginx反向代理之缓存 客户端IP透传 负载均衡

一 缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 相关选项&#xff1a; ​ proxy_cache zone_name | off; 默认off #指明调用的缓存&#xff0c;或关闭缓存机制;C…