Ton*_*ion 2 c# stack-overflow quicksort
所以我一直在努力实现一个快速排序,只是为了从中学习一些东西,但它也会产生一个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;
}
Run Code Online (Sandbox Code Playgroud)
你正在那里做一个无限循环
DoQuickSort(great);
Run Code Online (Sandbox Code Playgroud)
你需要一种方法来摆脱带有旗帜或条件的循环
编辑
我将在调试模式下添加它,使用默认设置,在抛出异常之前只能达到10,000到16,000之间的递归调用,在释放模式下只能达到50,000到80,000之间,所有这些都取决于执行的实际代码.
如果您使用大量值,则可能需要使用Stack对象来管理自己的递归调用.
示例代码,以查看崩溃前的调用量;
(调试; 14,210通话,发布80,071通话)
static int s = 1;
static void Main(string[] args)
{
o();
}
static void o()
{
s++;
Console.WriteLine(s.ToString());
o();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
627 次 |
| 最近记录: |