我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道Stackoverflow
是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:
class quickSort
{
const int NOOFELEMENTS = 10000000;
// this is our array to sort
private int[] arr = new int[NOOFELEMENTS];
// this holds a number of elements in array
private int len;
// Quick Sort Algorithm
public void QuickSort()
{
sort(0, len - 1);
}
public void sort(int left, int right)
{
int pivot, l_holder, r_holder;
l_holder = left;
r_holder = right;
pivot = arr[left];
while (left < right)
{
while ((arr[right] >= pivot) && (left < right))
{
right--;
}
if (left != right)
{
arr[left] = arr[right];
left++;
}
while ((arr[left] <= pivot) && (left < right))
{
left++;
}
if (left != right)
{
arr[right] = arr[left];
right--;
}
}
arr[left] = pivot;
pivot = left;
left = l_holder;
right = r_holder;
if (left < pivot)
{
sort(left, pivot - 1);
}
if (right > pivot)
{
sort(pivot + 1, right);
}
}
public static void Main()
{
quickSort q_Sort = new quickSort();
int[] arr = new int[NOOFELEMENTS];
Random rnd = new Random();
for (int i = 0; i < NOOFELEMENTS; i++)
{
arr[i] = rnd.Next(0, 1000);
}
q_Sort.arr = arr;
q_Sort.len = q_Sort.arr.Length;
var startTime = DateTime.Now;
// Sort the array
q_Sort.QuickSort();
Console.WriteLine("Total Time: {0}\n", DateTime.Now - startTime);
}
}
嗯。您的代码将在log2 10000000和10000000级别之间递归。
取决于编译器中的尾递归优化(如果有的话),它可以使用大量堆栈空间。
问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。
问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换
我写了以下内容: 解决4clojure.com的问题#118:http://www.4clojure.com/problem/118 当我询问时,不出所料,我会得到一个clojure.lang.lazyseq,但我不知道这与简单地删除lazy-seq“包装”有什么区别。 当然,现在如果删除lazy-seq,我会得到一个stackoverflow,为什么要执行这个: 否则(也就是说:如果我让lazy
尝试使用Hoare分区方案实现快速排序,但我遇到了一个问题,即无论数组大小如何,更改pivot的索引都会导致溢出。代码: 这个实现选择低索引(这里名为min)作为轴心元素,这样做很好。但是,将pivot元素更改为任何其他索引都会导致StackOverflow错误,而与正在排序的数组的大小无关。(错误参考第3行,其中调用了partition())我最好在(min,max)范围内随机选择pivot元素
我有一个类 Delete 我想使用 Gson 库将其转换为 json,但是当我转换它时,它会抛出 这是我的类 这里是枚举类DeleteStatus.scala 删除原因.scala 以下是我如何在Json转换 但它抛出以下异常 请帮助其中的错误
前几天我看了一个演讲,演讲者使用了McIlroy的论文《快速排序的致命对手》中概述的技术来生成数组的输入。为将触发O(n2行为的基元类型排序。该序列导致pivot选择总是将数组大小减少一个常数,这导致了Java数组。sort函数导致堆栈溢出。 根据JDK的源文件,快速排序实现函数没有防止堆栈溢出的保护措施。通过让排序例程不触发两次递归调用,而是使用时循环为较大的子数组重用当前堆栈帧,并且只递归一次