双向链表

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

循环链表

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

归并排序

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

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

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

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

源程序

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

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

  1. C语言以递归实现归并排序Merge Sort算法(附完整源码)

    以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...

  2. C语言归并排序Merge Sort算法(附完整源码)

    归并排序Merge Sort 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) #include ...

  3. 归并排序(merge sort)算法实现

    归并排序(merge sort)体现了分治的思想,即将一个待排序数组分为两部分,对这两个部分进行归并排序,排序后,再对两个已经排序好的数组进行合并.这种思想可以用递归方式很容易实现.归并排序的时间复杂 ...

  4. python实现基本算法之归并排序(Merge sort)

    基本算法之归并排序(Merge sort) 基本算法-04.归并排序(Merge sort)算法 .往期请看选择排序,插入排序,归并排序,快速排序等等都发布的!欢迎大家批评指正! 文章目录 基本算法之 ...

  5. 双向链表(Doubly Linked List)

    双向链表(Doubly Linked List) 1. 双向链表的概念 1.1 双向链表的定义 双向链表又称为双链表,是链表的一种. 1.2 双向链表的结点结构 双向链表的结点包括三个部分:前驱指针域 ...

  6. C语言实现双向链表Doubly Linked List(附完整源码)

    双向链表Doubly Linked List list结构体 实现以下6个接口 双向链表Doubly Linked List完整源码(定义,实现,main函数测试) list结构体 typedef s ...

  7. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...

  8. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  9. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  10. 归并python_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

最新文章

  1. 【实习招聘】字节跳动智能创作AutoML团队招聘
  2. 基于农业物联网的感知数据获取和可视化系统
  3. poj2566Bound Found尺取法进阶(java)
  4. (oracle)二、创建数据库
  5. Python基础教程:回调在编程中的含义
  6. naarray查询 swift_Swift 4最全的新特性详细解析(推荐)
  7. tortoise清理本地分支_本地:延庆运污水环卫抽化粪池
  8. shell编程-变量
  9. 2016: C语言实验——打印金字塔
  10. Verilog hdl 宏定义编译报错
  11. 进制转换练习-其它进制转换为十进制
  12. Java thread(4)
  13. IIS 7.5 下PHP(FastCGI模式)配置手记
  14. ORACLE查询不可用状态索引
  15. 打印Fibonacci数列方法汇总(前20项,每行5个)
  16. java中的命名空间_XPath与Java中的命名空间
  17. Linux源码下Makefile详解(参照Documentation\kbuild\makefiles.txt和资料)-转
  18. oracle 参数类型 存储过程 获取_oracle Array类型作为参数传入函数(存储过程) 大字符串参数解决方案...
  19. Pycharm安装与汉化教程
  20. php物料编码生成器,物料编码生成器软件

热门文章

  1. ASP视频教程:SQL语句1
  2. 文本数据挖掘-----词向量
  3. 电子计算机上total,计算器频幕上grand total 什么意思
  4. 【计算机网络技术】IP 地址共分哪几类?怎样确定一个IP地址它是属于哪一类的?
  5. accurately Buy Diesel watches how you can suitably
  6. 小米论坛php,黑橙新版小米社区discuz模板
  7. 国外PHP免费空间速度评测
  8. Ubuntu(20.04):设置DNS
  9. 新西兰计算机最好大学排名,2017新西兰大学计算机专业排名TOP10经典院校一览
  10. GBASE 8s UDR内存管理_05_mi_free