另一个快速排序 stackoverflow

2023-11-29

所以我一直在尝试自己实现一个快速排序,只是为了从中学习一些东西,但它也生成了一个stackoverflowException,但我似乎找不到原因是什么。

有人可以给我线索吗?

  public void Partition(List<int> valuelist, out List<int> greater, out List<int> lesser)
        {
            lesser = new List<int>();  // <-- Stackoverflow exception here!
            greater = new List<int>();

            if (valuelist.Count <= 1)
                return;

            pivot = valuelist.First();

            foreach (int Element in valuelist)
            {
                if (Element <= pivot)
                    lesser.Add(Element);
                else
                    greater.Add(Element);
            }
        }

        public List<int> DoQuickSort(List<int> list)
        {
            List<int> great;
            List<int> less;

            Partition(list, out great, out less);

            DoQuickSort(great);
            DoQuickSort(less);

            list.Clear();
            list = (List<int>)less.Concat(great);

            return list;

        }

你正在那里做一个无限循环

  DoQuickSort(great);

您需要一种方法来通过标志或条件退出该循环

Edit
我要补充的是,在调试模式下,默认设置下,在抛出异常之前只能达到 10,000 到 16,000 次递归调用,而在发布模式下则只能达到 50,000 到 80,000 次,所有这些都取决于实际执行的代码。

如果您使用大量值,您可能需要使用以下方法来管理递归调用:Stack object.

示例代码以查看崩溃前有多少调用;
(调试;14210调用,释放80071调用)

   static int s = 1;
    static void Main(string[] args)
    {
        o();
    }

    static void o()
    {
        s++;
        Console.WriteLine(s.ToString());
        o();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

另一个快速排序 stackoverflow 的相关文章

随机推荐