我收到一个名为“java.lang.StackOverflowError”的错误
此代码基于“算法简介”的伪代码
这是我的代码:
package algoritmos;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Esteban
*/
public class QuickSort {
private static BufferedReader read;
private static Random randomGenerator;
private static int[] vector;
private static int size;
private static int random;
private static void printArray() {
for(int i=0; i<size; i++) {
System.out.print("a[" + i + "] = " + vector[i] +", ");
}
}
static void Quicksort(int A[], int p, int r)
{
if(p < r)
{
int q = Partition(A, p, r);
Quicksort(A, p, q - 1);
Quicksort(A, q + 1, r);
}
}
static int Partition(int A[], int p, int r)
{
int x = A[r];
int i = p - 1, t;
for(int j = p; j <= (r-1); j++)
{
if(A[j] <= x)
{
i++;
t = A[i];
A[i] = A[j];
A[j] = t;
}
}
t = A[i + 1];
A[i + 1] = A[r];
A[r] = t;
return i + 1;
}
public static void main(String[] args) {
read = new BufferedReader(new InputStreamReader(System.in));
randomGenerator = new Random();
try
{
System.out.print("Por favor ingrese el tamaño del array: ");
size = Integer.parseInt(read.readLine());
System.out.print("Por favor ingre el rango de los numeros: ");
random = Integer.parseInt(read.readLine());
// creo el vector
vector = new int[size];
// lleno el array aleatoriamente
for(int i=0; i<size; i++) {
vector[i] = randomGenerator.nextInt(9);
}
//printArray();
System.out.println(Arrays.toString(vector));
// runtime timer
long start = System.currentTimeMillis();
//System.out.println("Starting : " + start);
Quicksort(vector,0,vector.length-1);
// runtime timer
System.out.println(System.currentTimeMillis() - start + " millisecond.");
//printArray();
System.out.println(Arrays.toString(vector));
}
catch(IOException | NumberFormatException ex)
{
}
/*int[] A = { 1, 23, 45, 2, 8, 134, 9, 4, 2000 };
Quicksort(A, 0, A.length-1);
System.out.print("\nArreglo ordenado: ");
for(int i = 0; i < A.length; i++)
System.out.print(A[i] + " "); */
}
}//final funcion
当我尝试在100.000中调整数组大小时,输出为:
Exception in thread "main" java.lang.StackOverflowError
at algoritmos.QuickSort.Quicksort(QuickSort.java:43)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
at algoritmos.QuickSort.Quicksort(QuickSort.java:46)
请帮助我!
答案 0 :(得分:1)
我没有阅读你的所有代码...但我相信你的错误在于QuickSort的递归调用。 Quicksort被递归调用很多次导致堆栈溢出,因为堆栈耗尽了内存。
QuickSort被称为“无限”次数,因为它永远不会出现退出状态
if(p < r)
由于你的分区函数调用
int q = Partition(A, p, r);
这里的某个地方存在我认为的错误。
答案 1 :(得分:0)
在Quicksort
方法中,您有以下代码:
static void Quicksort(int A[], int p, int r)
{
if(p < r)
{
int q = Partition(A, p, r);
Quicksort(A, p, q - 1);
Quicksort(A, q + 1, r);
...
在Quicksort
方法中调用 Quicksort
,因此您的程序会陷入无限循环。