Quicksort中的java.lang.StackOverflowError基于“算法入门”一书

时间:2013-12-14 17:41:18

标签: java stack-overflow quicksort

我收到一个名为“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)

请帮助我!

2 个答案:

答案 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,因此您的程序会陷入无限循环。