- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用采用 float 的测试类来实现快速排序的版本。当我尝试生成大小为 10⁸ 的数组时,我在运行测试类时出现堆栈溢出。
我尝试使用 10⁷ 的数组大小,效果很好
在我的测试类中,我生成了两个完全相同的数组,一个是用我的算法排序的,一个是用javas Arrays.sort()
排序的。 .
这是我的测试类的样子。
package Quicksort;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.*;
public class QuickSortTest {
private static float[] quickSort, javaSort;
private final static int SIZE = (int) 1e7;
@Before
public void init(){
System.gc();
quickSort = new float[SIZE];
javaSort = new float[SIZE];
for(int i = 0; i < SIZE; i++){
int temp = (int) (Math.random() * 1000) + 1;
quickSort[i] = temp;
}
javaSort = quickSort;
}
@Test
public void testQuickSort(){
QuickSort.sort(quickSort);
Arrays.sort(javaSort, 0, SIZE);
assertArrayEquals(quickSort, javaSort, .0f);
}
}
快速排序实现:
private static void quickSort(float[] table, int first, int last){
if(first < last){
int pivotIndex = partition(table, first, last);
quickSort(table, first, pivotIndex - 1);
quickSort(table, pivotIndex + 1, last);
}
}
public static int partition(float[] table, int first, int last){
sort3(table, first, last);
swap(table, first, (first + last) / 2);
float pivot = table[first];
int up = first;
int down = last;
do{
while((up < last) && table[up] <= pivot){
up++;
}
while(table[down] > pivot){
down--;
}
if(up < down){
swap(table, up, down);
}
}while(up < down);
swap(table, first, down);
return down;
}
最佳答案
StackOverflowError
通常是由错误的递归调用引起的。您的 QuickSort 类有一个递归函数,当您传入长度为 10^8 的数组时,该函数会在超出堆栈大小时不断调用自身。
解决此问题的一种方法是将您的实现切换为迭代方法而不是递归方法。
根据您的上次更新,似乎 partition()
方法递归地调用自身,超出了 Java 堆空间的限制。
在此post ,您可以找到迭代 partition()
实现。它稍微复杂一些,但能够处理数组的大小。
import java.util.Arrays;
import java.util.Random;
// Java program for implementation of QuickSort
class QuickSort
{
public static void main(String[] args) {
QuickSort sort=new QuickSort();
int[] randomArray = createRandomArray((int) Math.pow(2, 20));
sort.qSort(randomArray);
//System.out.println(Arrays.toString(randomArray));
}
private void qSort(int[] arr) {
this.qSort(arr, 0, arr.length-1);
}
/* This function takes last element as pivot,
places the pivot element at its correct
position in sorted array, and places all
smaller (smaller than pivot) to left of
pivot and all greater elements to right
of pivot */
int partition(int arr[], int low, int high)
{
int pivot = arr[high];
int i = (low-1); // index of smaller element
for (int j=low; j<=high-1; j++)
{
// If current element is smaller than or
// equal to pivot
if (arr[j] <= pivot)
{
i++;
// swap arr[i] and arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// swap arr[i+1] and arr[high] (or pivot)
int temp = arr[i+1];
arr[i+1] = arr[high];
arr[high] = temp;
return i+1;
}
/* The main function that implements QuickSort()
arr[] --> Array to be sorted,
low --> Starting index,
high --> Ending index */
void qSort(int arr[], int low, int high)
{
if (low < high)
{
/* pi is partitioning index, arr[pi] is
now at right place */
int pi = partition(arr, low, high);
// Recursively sort elements before
// partition and after partition
qSort(arr, low, pi-1);
qSort(arr, pi+1, high);
}
}
private static int[] createRandomArray(int size){
Random randNumGenerator = new Random();
int[] arr = new int[size];
for (int i=0; i<arr.length; i++)
{
arr[i] = (randNumGenerator.nextInt(100)+1);
}
return arr;
}
}
您似乎想牢记以下内容;
关于java - 当数组变得太大时 Stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423647/
使用 htaccess 我能够隐藏文件扩展名,使其成为/home 而不是/home.html。但是,对于主页,我想完全隐藏文件名,例如 stackoverflow.com,而不是 stackoverf
我试图在关闭子窗体时关闭我的主(父)窗体。然而,这给了我一个 StackOverflow 异常。 但是,如果我在 FormClosed 事件上调用 _child.Dispose,它会按预期工作。我应该
我在 IDEA 中使用 Gradle 并得到以下输出。 * What went wrong: A problem occurred evaluating script. > java.lang.Sta
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
我需要编写一个程序来生成一些随机数,而不让两个数字落在某个范围内。不幸的是,我需要在学校做这件事,而我在计算机上唯一可以使用的语言是 Java(否则我会用 C++ 来做)。我对 Java 知之甚少,我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
使用 scala,我已将大约 100000 个节点添加到链表中。当我使用函数 length 时,例如 mylist.length。我收到“java.lang.StackOverflowError”错误
我正在开发一个学校项目,该项目必须有 3 个带 1 个指针的快速排序、3 个带 2 个指针和 2 个堆的快速排序。 到目前为止,我已经编写了快速排序和堆之一。我遇到的问题是快速排序在小情况下工作正常,
我正在制作一个程序,它生成列表的所有子集,然后排列所有这些子集。我有一个生成子集的方法和一个生成排列的方法。但是,它们不能一起工作,即当我排列子集时,我没有得到子集的所有排列,并且出现 StackOv
我有以下函数,它应该产生笛卡尔平面中的所有坐标,我可以在n步中从原点到达: 原点是“位置”,步数是“强度”,它是一个 1-10 的整数。但是,我不断收到 stackoverflow 错误。每次我调用它
当我尝试使用 scala lib(使用 re2)匹配上述正则表达式时,代码进入以下路径并超时 1 分钟: 正则表达式: (([a-z0-9!#$%&'*+?^_`{|}~-]+(?:.[a-z0-9!
我正在开发一个运输 map 项目。我为该位置创建了一个名为 Chart 的对象和一个名为 Pos 的对象。我无法开始工作的是,当我从文本文件读取图表以正确创建对象 Pos 时,因为这就是失败的地方。
public class SortAnimal { public static Comparator getAnimalTagComparator() { return
我因使用以下泛型而收到 StackOverflowError: 积分: package me.expdev.gkitpvp; /* * Project created by ExpDev */ i
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我为一些命题逻辑表达式编写了一个javaCC解析器。表达式可能会很长,有 30k 个字符。 当我解析如此大的表达式时,出现堆栈溢出异常。 是否有一些虚拟机参数决定堆栈大小? 或者在这种情况下你会怎么做
这个问题已经有答案了: What is a StackOverflowError? (15 个回答) 已关闭 8 年前。 最高数字double可以代表极高,我想。尽管下面的代码会抛出异常。这实际上是我
我正在为我的 API 构建一个 SDK,其中有两个模块,分别是 A 类和 B 类。 public class A{ public final B = new B(); public f
执行此递归时,我收到堆栈溢出错误。有一个模式,它第一次说: at MazeGui.move(MazeGui.java:79) which is line if(rigting.goal == true
我编写的这段代码在达到一定的输入大小之前效果很好。如果输入太大,我会收到“java.lang.StackOverflowError”。我已经阅读了 stackoverflow 上有关此主题的其他一些条
我是一名优秀的程序员,十分优秀!