【问题标题】:How can you Merge sort a .Net framework LinkedList (of T)你如何合并排序一个.Net框架LinkedList(T)
【发布时间】:2011-01-04 01:47:03
【问题描述】:

有几个问题讨论了对 LinkedList 进行合并排序,但如何使用 C# LinkedList 来解决?

由于 LinkedListNode Next 和 Previous 属性是只读的,我遇到的大多数就地算法都是不可能的。

我已经采取措施删除所有节点,使用 .OrderBy(node => node.Value) 对它们进行排序,然后将它们重新插入到链接列表中,但这相当粗糙。

【问题讨论】:

    标签: c# algorithm sorting linked-list


    【解决方案1】:

    您可以通过调用Remove,然后调用AddAfter来重新排序节点。

    【讨论】:

      【解决方案2】:

      如果您不介意合并到新序列,以下示例应用演示了一种合并两个排序序列的算法:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace Merge
      {
          class Program
          {
              static IEnumerable<T> Merge<T>(IEnumerable<T> left, IEnumerable<T> right)
                  where T: IComparable<T>
              {
                  IEnumerator<T> l = left.GetEnumerator();
                  IEnumerator<T> r = right.GetEnumerator();
      
                  bool l_has_data = l.MoveNext();
                  bool r_has_data = r.MoveNext();
      
                  while (l_has_data || r_has_data)
                  {
                      if (!l_has_data && r_has_data)
                      {
                          yield return r.Current;
                          r_has_data = r.MoveNext();
                          continue;
                      }
                      if (!r_has_data && l_has_data)
                      {
                          yield return l.Current;
                          l_has_data = l.MoveNext();
                          continue;
                      }
      
                      int comp = l.Current.CompareTo(r.Current);
                      if (comp < 0)
                      {
                          yield return l.Current;
                          l_has_data = l.MoveNext();
                      }
                      else if (comp > 0)
                      {
                          yield return r.Current;
                          r_has_data = r.MoveNext();
                      }
                      else
                      {
                          yield return l.Current;
                          yield return r.Current;
                          l_has_data = l.MoveNext();
                          r_has_data = r.MoveNext();
                      }
                  }
              }
      
              static void Main(string[] args)
              {
                  var left = new[] { 1, 4, 7, 9, 10 };
                  var right = new[] { 1, 2, 3, 6, 8, 9, 11 };
      
                  foreach (var i in Merge(left, right))
                      Console.WriteLine(i);
              }
          }
      }
      

      这可以通过重构来清理一下,但它纯粹是为了演示合并。正如所写,它也适用于任何可枚举序列,而不仅仅是链表。

      请注意示例,如图所示会产生以下输出:

      1
      1
      2
      3
      4
      6
      7
      8
      9
      9
      10
      11
      

      【讨论】:

      • 可能我的措辞不是很清楚,但是我想对链表进行排序,而不是合并两个已经排序的列表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2022-08-23
      • 2011-08-18
      相关资源
      最近更新 更多