【问题标题】:Quick Sort using C#使用 C# 快速排序
【发布时间】:2021-10-30 05:15:46
【问题描述】:

您好,我尝试进行快速排序但没有出现结果,例如用户输入“cdabe”,因此预期结果为“abcde”。我可以知道结果没有显示的原因是什么吗? 因为代码中没有错误。我正在使用 MVC。我的 MergeSort 工作正常,但我的 QuickSort 没有。

型号:

public string QuickSort()
            {
                string arrangedSort = "";
                string Word= "cdabe";
                List<string> ListLetters = new List<string>();
                for (int i = 0; i < Word.Length; i++)
                {
                    ListLetters.Add(Word.Substring(i, 1)); 
                }
               
                aQuicksort(Word, 0, ListLetters.Count - 1);
    
             
              void aQuicksort(string Word, int left, int right)
                {
                    int i = left;
                    int j = right;
    
                    var pivot = Word[(left + right) / 2];
    
                    while (i <= j)
                    {
                        while (char.Parse(ListLetters[i]) < pivot)
                            i++;
    
                        while (char.Parse(ListLetters[i]) > pivot)
                            j--;
    
                        if (i <= j)
                        {
                            var tmp = ListLetters[i];
                            ListLetters[i] = ListLetters[j];
                            ListLetters[j] = tmp;
    
                            i++;
                            j--;
                        }
                    }
    
                    if (left < j)
                        aQuicksort(Word, left, j);
    
                    if (i < right)
                        aQuicksort(Word, i, right);
    
                    foreach (var listLetter in ListLetters)
                    {
                        arrangedSort += listLetter;
                    }
                    
    
                }
    
                return arrangedSort;
    
    
            }

【问题讨论】:

  • 结果没有显示的原因是什么? - 因为你没有包含任何Console.writeLine 或类似的
  • 您的代码很难排除故障。 Word 既是参数 也是 嵌入函数中的变量。 aquicksort 是本地函数,没有特殊原因。这在语法上都是合法的,但容易出错。我假设您是 C# 新手 - 所以我建议您清理/简化您的代码,然后进行一些调试
  • 很抱歉,经过您的编辑,这个问题不再有意义。这是模型?控制器?早点比较好
  • 在 C# 中,字符串可以被视为字符数组。您可以要求"hello world"[4] 并获得'o' 您还可以使用.ToCharArray 将字符串转换为字符数组 - 这样您将字符串子串到字符串列表中的整个位,然后将它们解析为字符- 把它扔掉,做一个 ToCharArray,用 char 数组做所有的工作,把数组一直保持为 chars 直到它被排序,然后用new string(theArray) 把它变成一个字符串。目前,您正在做的所有字符串操作都使这是一个相当缓慢的快速排序..
  • 要在 C# 中进行快速排序,请使用 Array.SortList.Sort

标签: c# model-view-controller quicksort


【解决方案1】:

试试这个实现,它使用 LinQ using System.linq

public static IEnumerable<int> QSort3(IEnumerable<int> source)
    {
        if (!source.Any())
            return source;
        int first = source.First();

        QSort3Helper myHelper = 
          source.GroupBy(i => i.CompareTo(first))
          .Aggregate(new QSort3Helper(), (a, g) =>
              {
                  if (g.Key == 0)
                      a.Same = g;
                  else if (g.Key == -1)
                      a.Less = g;
                  else if (g.Key == 1)
                      a.More = g;
                  return a;
              });
        IEnumerable<int> myResult = Enumerable.Empty<int>();
        if (myHelper.Less != null)
            myResult = myResult.Concat(QSort3(myHelper.Less));
        if (myHelper.Same != null)
            myResult = myResult.Concat(myHelper.Same);
        if (myHelper.More != null)
            myResult = myResult.Concat(QSort3(myHelper.More));

        return myResult;
    }

    public class QSort3Helper
    {
        public IEnumerable<int> Less;
        public IEnumerable<int> Same;
        public IEnumerable<int> More;
    }

来自this post的代码

【讨论】:

  • 我认为他们可能希望被告知他们的钓鱼技术出了什么问题,而不是被给予海豚
  • @CaiusJard 这就是我给他们一只海豚的原因,所以他们知道该钓什么鱼。
  • 最好给他们像Array.Sort.OrderBy这样的鲸鱼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多