Avatar billede tchami Nybegynder
23. februar 2004 - 16:49 Der er 3 kommentarer og
1 løsning

Stackoverflowerror, hvorfor

Hej,

Jeg forsøger at implementere en QuickSort algoritme der skal sortere et array af strings, men det går ikke helt som forventet. Teorien bag koden burde være fin nok, men alligevel får jeg en StackOverflowErrror fejl i følgende tre linie når jeg forsøger at køre skidtet:

i = s1.compareTo(s2);

while((l<r) && (compareStrings(t[r],split) == 1)){

sortStringArray(t,start,r);

Klassen ser ud som følger (klassen der kalder denne klasse følger umiddelbart efter):

public class IntStringQuicksort {

public static void quicksort(String[] a)
{
System.out.print("Array before sorting: ");
printArray(a);
System.out.println(" ");

sortStringArray(a, 0, a.length-1);

System.out.print("Array after sorting: ");
printArray(a);
}

// Private function that does the sorting
private static void sortStringArray(String[] t, int start, int ende)
{
  int span = ende - start + 1;
  if(span > 1){
    String split = t[start];
    String help;
    int l = start;
    int r = ende;
    while(l < r){
    while((l<r) && (compareStrings(t[r],split) == 1)){
    r--;
    }
    while((l<r) && (compareStrings(t[l],split) == 0)){
    l++;
    }
    if(l < r){
    help = t[l];
    t[l] = t[r];
    t[r] = help;
    r--;
    l++;
    }
    }//while
  //recursive calls
  sortStringArray(t,start,r);
  sortStringArray(t,r+1,ende);
    }//if
}

/* Private function that compares two strings
* Returns 1 if s1 is larger than s2
* Returns 0 if s1 is smaller than s2
*/
private static int compareStrings(String s1, String s2)
{
  int i, j = 0; 
  i = s1.compareTo(s2);
 
  if (i > 0)
  {
  j = 1;
  } 
  else if (i < 0)
  {
  j = 0;
  }
 
  return j;   
}

// Private function that prints out the array if it's shorter than or equal to 20
private static void printArray(String[] a)
{
if (a.length <= 20)
  {
  System.out.print(a[0]);
  for (int i = 1; i < a.length; i++)
  {
    System.out.print("," + a[i]);
  }
  }
else
  {
  System.out.println("Array length is less than 20 and is thus not printed.");
  }
}
}

public class IntStringQuicksortTest {

public static void main(String[] args) {
  String[] a = {"1203","007","008","0123","00123"};
  IntStringQuicksort.quicksort(a);
}
}

Nogle der kan se hvad jeg gør galt?
Avatar billede arne_v Ekspert
23. februar 2004 - 17:21 #1
stack overflow kan næsten kun skyldes at den recurser uendeligt
Avatar billede arne_v Ekspert
23. februar 2004 - 17:27 #2
Prøv at erstatte:

sortStringArray(t,r+1,ende);
   
med:

sortStringArray(t,l,ende);
Avatar billede arne_v Ekspert
23. februar 2004 - 17:46 #3
Hm. Der skal også lige rettes et par andre småting til.

Den her version virker:

public class QS {

    public static void quicksort(String[] a) {
        System.out.print("Array before sorting: ");
        printArray(a);
        System.out.println(" ");

        sortStringArray(a, 0, a.length - 1);

        System.out.print("Array after sorting: ");
        printArray(a);
    }

    // Private function that does the sorting
    private static void sortStringArray(String[] t, int start, int ende) {
        int span = ende - start + 1;
        if (span > 1) {
            String split = t[start];
            String help;
            int l = start;
            int r = ende;
            while (l <= r) {
                while ((r > start) && (compareStrings(t[r], split) == 1)) {
                    r--;
                }
                while ((l < ende) && (compareStrings(t[l], split) == -1)) {
                    l++;
                }
                if (l <= r) {
                    help = t[l];
                    t[l] = t[r];
                    t[r] = help;
                    r--;
                    l++;
                }
            } //while
            //recursive calls
            sortStringArray(t, start, r);
            sortStringArray(t, l, ende);
        } //if
    }

    /* Private function that compares two strings
    * Returns 1 if s1 is larger than s2
    * Returns 0 if s1 is smaller than s2
    */
    private static int compareStrings(String s1, String s2) {
        int i, j;
        i = s1.compareTo(s2);

        if (i > 0) {
            j = 1;
        } else if (i < 0) {
            j = -1;
        } else {
            j = 0;
        }

        return j;
    }

    // Private function that prints out the array if it's shorter than or equal to 20
    private static void printArray(String[] a) {
        if (a.length <= 20) {
            System.out.print(a[0]);
            for (int i = 1; i < a.length; i++) {
                System.out.print("," + a[i]);
            }
        } else {
            System.out.println(
                "Array length is less than 20 and is thus not printed.");
        }
    }

    public static void main(String[] args) {
        String[] a = { "1203", "007", "008", "0123", "00123" };
        quicksort(a);
    }
}
Avatar billede tchami Nybegynder
23. februar 2004 - 21:54 #4
Takker :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester