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


    1 双向链表

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

    2 循环链表

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

    3 归并排序

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

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

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

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

    4 源程序

    1. using System.Text;
    2. using System.Collections;
    3. using System.Collections.Generic;
    4. namespace Legalsoft.Truffer.Algorithm
    5. {
    6. public class DoublyLinkNode
    7. {
    8. public int Data { get; set; } = 0;
    9. public DoublyLinkNode Next { get; set; } = null;
    10. public DoublyLinkNode Prev { get; set; } = null;
    11. public DoublyLinkNode(int d)
    12. {
    13. Data = d;
    14. }
    15. }
    16. public partial class DoublyLinkedList
    17. {
    18. public DoublyLinkNode Head { get; set; } = null;
    19. private DoublyLinkNode Split(DoublyLinkNode head)
    20. {
    21. DoublyLinkNode fast = head;
    22. DoublyLinkNode slow = head;
    23. while (fast.Next != null && fast.Next.Next != null)
    24. {
    25. fast = fast.Next.Next;
    26. slow = slow.Next;
    27. }
    28. DoublyLinkNode temp = slow.Next;
    29. slow.Next = null;
    30. return temp;
    31. }
    32. private DoublyLinkNode Merge_Utility(DoublyLinkNode first, DoublyLinkNode second)
    33. {
    34. if (first == null)
    35. {
    36. return second;
    37. }
    38. if (second == null)
    39. {
    40. return first;
    41. }
    42. if (first.Data < second.Data)
    43. {
    44. first.Next = Merge_Utility(first.Next, second);
    45. first.Next.Prev = first;
    46. first.Prev = null;
    47. return first;
    48. }
    49. else
    50. {
    51. second.Next = Merge_Utility(first, second.Next);
    52. second.Next.Prev = second;
    53. second.Prev = null;
    54. return second;
    55. }
    56. }
    57. public DoublyLinkNode Merge_Sort(DoublyLinkNode node)
    58. {
    59. if (node == null || node.Next == null)
    60. {
    61. return node;
    62. }
    63. DoublyLinkNode second = Split(node);
    64. node = Merge_Sort(node);
    65. second = Merge_Sort(second);
    66. return Merge_Utility(node, second);
    67. }
    68. public static List<int> ToList(DoublyLinkNode head)
    69. {
    70. List<int> list = new List<int>();
    71. while (head != null)
    72. {
    73. list.Add(head.Data);
    74. head = head.Next;
    75. }
    76. return list;
    77. }
    78. public static string ToHtml(DoublyLinkNode head, DoublyLinkNode cur)
    79. {
    80. StringBuilder sb = new StringBuilder();
    81. sb.AppendLine("");
    82. while (head != null)
    83. {
    84. if (head == cur)
    85. {
    86. sb.AppendLine("
      " + head.Data + "
      "
      );
    87. }
    88. else
    89. {
    90. sb.AppendLine("
      " + head.Data + "
      "
      );
    91. }
    92. if (head.Next != null)
    93. {
    94. sb.AppendLine("");
    95. }
    96. head = head.Next;
    97. }
    98. return sb.ToString();
    99. }
    100. }
    101. }

    POWER BY 315SOFT.COM

  • 相关阅读:
    跨界电商、游戏技与代理IP的关联
    投资失败+转岗降薪,2年逆袭月薪30K,我的船终于靠了岸
    使用Sqoop命令从Oracle同步数据到Hive,修复数据乱码 %0A的问题
    分析 Base64 编码和 URL 安全 Base64 编码
    北京十大律师事务所排名前十名有哪些?找律师必看!
    C++ Builder XE RzCheckTree1的树形显示用法
    java-net-php-python-s2sh教学管理平台hsg8229AGA2录像计算机毕业设计程序
    MySQL事务日志--redo, undo详解
    台灯显色指数多少好?护眼台灯该这样选择
    如何从清空的回收站中恢复已删除的Word文档?
  • 原文地址:https://blog.csdn.net/beijinghorn/article/details/124749766