当前位置:   article > 正文

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("<style>");
  82. sb.AppendLine(".node { float:left;width:45px;height:45px;line-height:45px;font-size:21px;text-align:center;border:solid 1px #DD0000; }");
  83. 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; }");
  84. 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; }");
  85. sb.AppendLine("</style>");
  86. while (head != null)
  87. {
  88. if (head == cur)
  89. {
  90. sb.AppendLine("<div class='node_cur'>" + head.Data + "</div>");
  91. }
  92. else
  93. {
  94. sb.AppendLine("<div class='node'>" + head.Data + "</div>");
  95. }
  96. if (head.Next != null)
  97. {
  98. sb.AppendLine("<div class='link'>--&gt;<br>&lt;--</div>");
  99. }
  100. head = head.Next;
  101. }
  102. return sb.ToString();
  103. }
  104. }
  105. }

POWER BY 315SOFT.COM

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/171808
推荐阅读
  

闽ICP备14008679号