MergeSort - StackOverflowError

0

Witam, jestem jeszcze lekko zielony z Javy, a mam do napisania algorytm sortowania MergeSort. Podczas uruchamiania poniższego programu pojawia mi się błąd StackOverflowError i nie mam pojęcia dlaczego tak się dzieje. Możliwe, że sam algorytm sortowania ma gdzieś błąd, ale to na razie jest mniej istotne jak dla mnie. Mógłby ktoś pomóc ?

public class Test {
    
    public static void main(String args[]){
        
        int[] tablica = {6,5,4,3,2,1,0,123,1234};
        MergeSort ob1 = new MergeSort();
        
        int[] tab1 = ob1.sortuj(0,8,tablica);
        
        //int k = 9;
        
        
        
         //System.out.println(ob1);
        
       for(int i=0;i<tablica.length;i++){
           System.out.println(tab1[i]);
        }
        
        
    }
}
public class MergeSort {
    
    static int tabPom[]; // t
    static int wynik[]; 
   
    
    static void scal(int start,int middle,int stop){
        
        
        int i = start;
        int j = middle +1;
        int k = start;
        
        
        wynik = new int[tabPom.length];
        
        while(i<=middle && j<=stop){
            System.out.println("jestem");
            if(tabPom[i]<tabPom[j]){
                
                wynik[k] = tabPom[i];
                i++;
            }
            else{
                
                wynik[k]=tabPom[j];
                j++;
            }
            k++;
        }
        while(i <= middle){
        wynik[k] = tabPom[i];
        i++;
        k++;
        }
        
    }
    
   static int[] sortuj(int start,int stop,int tab[]){
        tabPom = new int[tab.length];
        int middle;
        
        for(int z=0;z<tab.length;z++){
            tabPom[z]=tab[z];
        }
        
        start =0;
        stop = tab.length;
        
        if (start<stop){
        middle=(start+stop)/2;
        sortuj(start, middle,tab);    // Dzielenie lewej części
        sortuj(middle+1, stop,tab);   // Dzielenie prawej części
        scal(start, middle, stop);   // Łączenie części lewej i prawej
        }
        
   return wynik;     
   }
}
0

Najprawdopodobniej zbyt dużo razy, któraś funkcja wywołuje ci się rekurencyjnie, czyli odkłada na stosie, co powoduje jego przepełnienie czyli StackOverflow

0

Bylibyscie tak dobrzy i powiedzieli gdzie ? SIedze juz nad tym od dobrych 2 h i nie chce dzialac ;/

0
static int[] sortuj(int start,int stop,int tab[]){//tutaj przyjmuje tablice
        tabPom = new int[tab.length];
        int middle;
 
        for(int z=0;z<tab.length;z++){
            tabPom[z]=tab[z];
        }
 
        start =0;//tutaj start ustawia na 0
        stop = tab.length;// tutaj stop na koniec
 
        if (start<stop){
        middle=(start+stop)/2;
//GDZIEŚ TUTAJ POWINIENEŚ ZROBIĆ DWIE POMOCNICZE TABLICE GDZIE W PIERWSZEJ BĘDZIESZ PRZECHOWYWAŁ LEWĄ CZĘŚĆ TABLICY Z PARAMETRU A W DRUGIEJ PRAWĄ JEJ CZĘŚĆ
        sortuj(start, middle,tab);    // Dzielenie lewej części <-- tak na prawdę nie będziesz raczej dzielił lewej części bo wywołasz sortuj znowu z tą tablicą i start ustawisz na 0 a koniec na ostatni element
        sortuj(middle+1, stop,tab);   // Dzielenie prawej części <-- podobnie jak wyżej tylko chodzi o prawą część
        scal(start, middle, stop);   // Łączenie części lewej i prawej
        }
 
   return wynik;     
   }

tak mi się wydaje ale pewny nie jestem, musiałbym sobie sprawdzić u siebie, a póki co nie mam nic do Javy;)

0

blad jest taki ze w funkcji sortuj nadpidujesz zmienne start i stop przez co caly czas probujesz sortowac cala tablice. wywal te 2 linijki

0

Po wywaleniu tych dwoch linijek program dziala ,ale nie poprawnie. Dla wejscie 6,5,4,3,2,1 daje 3,2,1,6,5,4

0

To masz błąd w algorytmie zapewne. Debuger w dloń i szukaj gdzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1