Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Problema MergeSort

  1. #1

    Problema MergeSort

    Ho cercato di creare un MergeSort, ma ho un problema, un array di supporto, che chiamo S va fuori range e non capisco perchč:

    codice:
    public class MergeSort
    {
    	
    	public static void main(String [] args)
    	{
    		int [] a={3,6,5,7,9,8,0,5};
    		MSort(a,0,a.length-1);
    		
    	}
    	
    	
    	public static void merge(int [] a, int left,int center, int right)
    	{
    		int [] S=new int[a.length];
    		int i= left;
    		int j=center+1;
    		int k=0;
    	
    		
    		while(i<=center && j<=right)
    		{
    			if(a[i]<=a[j])
    			{
    				S[k]=a[i];     //qui c'č l'errore
    				i=i++;
    			}
    			else {
    				S[k]=a[j];
    				j=j++;
    				}
    				
    				k++;
    		}
    		
    		while(i<=center)
    		{
    			S[k++]=a[i];
    			i=i++;
    		}
    		
    		while(j<=right)
    		{
    			S[k++]=a[j];
    			j=j++;
    		}
    		/* for (k =left; k!=right; k++) 
    		a[k] =a[k - left];
    		*/
    		for(int b=0; b<S.length; b++)
    		System.out.print(S[b]+" ");
    
    	}
    	
    	
    	public static void MSort(int [] a,int left, int right)
    	{
    		
    		if(left<right)
    		{
    			
    			int center=(left+right)/2;
    				MSort(a,left,center);
    				MSort(a,center+1,right);
    				merge(a, left,center,right);
    				
    			
    		}
    	}
    }
    Volevo cerificare il funzionamento facendo una stampa, ma quello viene dopo, il problema č quello lģ, che non sto capendo a cosa sia dovuto.

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Postare il messaggio di errore e lo stacktrace che ti viene mostrato potrebbe rendere le cose molto pił facili: a occhio non riesco a individuare l'errore, e dovrei eseguire il programma per trovarlo (cosa che in questo momento non posso fare).
    Quello che di sicuro c'č di sbagliato sono le istruzioni di incremento

    Comunque l'algoritmo - a meno che tu non voglia fare qualcosa di particolarmente strano - non implementa affatto un merge sort: l'array "a" non viene ordinato, men che meno l'array di supporto "S", che č una variabile locale e viene re-istanziato ad ogni chiamata di merge() (che, ovviamente, č parte attiva della ricorsione di MSort).

  3. #3
    Bč, a dire il vero non ho ben capito il codice visto a lezione, e ho cercato di farlo in base a come ho capito io, i codici sono (pseudocodice):

    codice:
    Merge(A,n,B,m)
    i=j=0
    
    while(i<n && j<m) do
    
    if(A[i]>B[j])
    then C[k++]=B[j++]
    else C[k++]=A[i++]
    if(i==n) then
    while(j<m)do
    C[k++]=B[j++]
    else
    while(i<n) do
    
    C[k++]=A[i++]
    A meno che non abbia fatto errori di copiatura,A e B sono array, e poi il Mergesort, di cui sono pił perplesso:

    codice:
    Mergesort(A,i,j)
    if(i>=j) then return
    r=(i+j)/2
    Mergesort(A,i,r)
    Mergesort(A,r+1,j)
    Merge(A,i,r,j)
    Ma mi sembra strano...perchč l'ultima istruzione Merge prende quei parametri che non c'entrano niente visto che per come č stato fatto quel metodo deve prendere 2 array e invece lģ ce n'č uno solo?

    Se fosse sbagliato...non č che potresti darmi uno pseudocodice corretto?

    Grazie.

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Credo che per lo pseudocodice sia sufficiente Wikipedia:

    http://it.wikipedia.org/wiki/Merge_sort

    Fermo restando che non hai postato le informazioni sull'errore riscontravi, la grossa differenza rispetto al tuo codice č che non copi in "a" i valori ordinati all'interno dell'array di supporto "S".

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.