Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Problema Merge-Sort

  1. #1

    Problema Merge-Sort

    Ho provato ad implementare un Merge-Sort, solo che forse non ho ben capito come funziona e quindi ho sbagliato ad implementarlo....:

    codice:
    public class MergeSort
    {
    	public static void main(String [] args)
    	{
    		int []a={3,6,5,7,9,8,0,5};
    		int [] S=new int[a.length];
    		MSort(a,0,a.length-1);
    		
    	}
    	
    	
    	public static void merge(int [] a,int []b, int []S, int k)
    	{
    		int i=0;
    		int j=0;
    		k=0;
    		
    		
    		while(i<a.length && j<a.length)
    		{
    			if(a[i]<b[j])
    			{
    				S[k++]=a[i];
    				i=i++;
    			}
    			else if(a[i]>b[j])
    			{
    				S[k++]=b[j];
    				j=j++;
    			}
    		}
    		
    		while(i<a.length)
    		{
    			S[k++]=a[i];
    			i=i++;
    		}
    		
    		while(j<b.length)
    		{
    			S[k++]=b[j];
    			j=j++;
    		}
    	}
    	
    	
    	public static int MSort(int [] a,int i, int f)
    	{
    		if(i>=f)
    		{
    			int m=(i+f)/2;
    			return MSort(a,i,m);
    			return MSort(a,m+1,f);
    			merge(a,b);
    		}
    	}
    	
    		
    }
    Giustamente mi dą errore nel metodo MSort perchč non trova la variabile b.
    Perņ non ho capito a questo punto come implementarlo, cioč come faccio a passargli il sottoarray?

  2. #2
    dichiarati un vettore di nome b di interi come variabile d'istanza.

    inoltre, nel tuo metodo Msort dovresti avere un solo return perchč, come penso saprai, il return costituisce la fine di un metodo in quanto le istruzioni dopo di esso non verranno mai eseguite.
    poi, sempre nell'Msort, invochi il metodo merge con 2 parametri quando questo ne richiede 4.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68
    Ti suggerisco di vederti questa pagina di Wikipedia, dove oltre a capire come funziona il Merge Sort, puoi anche vedere un esempio di pseudo-codice che non ti sarą difficile mutare in codice Java.

  4. #4
    Si perņ...non ho ben capito come funzionano su Wikipedia left e rigth, dovrebbe tenere conto di quanti elementi ci sono nella parte sinistra dell'array e nella destra?
    Come faccio a farlo capire al metodo passandoglielo come parametro?
    L'ho cambiato cosģ ma rimangono tanti problemi, come faccio a farlo funzionare se non conosco la dimensione ,a la metą su cui operare....

    codice:
    public class MergeSort
    {
    	public static void main(String [] args)
    	{
    		int []a={3,6,5,7,9,8,0,5};
    		int [] S=new int[a.length];
    		int []b;
    		MSort(a,0,a.length-1);
    		
    	}
    	
    	
    	public static void merge(int [] a,int [] b,int []S, int left,int center, int right)
    	{
    		int i= left;
    		int j=center+1;
    		int k=0;
    		
    		
    		while(i<center && j<right)
    		{
    			if(a[i]<b[j])
    			{
    				S[k++]=a[i];
    				i=i++;
    			}
    			else if(a[i]>b[j])
    			{
    				S[k++]=b[j];
    				j=j++;
    			}
    		}
    		
    		while(i<a.length)
    		{
    			S[k++]=a[i];
    			i=i++;
    		}
    		
    		while(j<b.length)
    		{
    			S[k++]=b[j];
    			j=j++;
    		}
    	}
    	
    	
    	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,b,S,left,center,right);
    		}
    	}
    	
    		
    }

  5. #5
    Ora di compilare compila, perņ non so se č corretto......come faccio a stampare l'array ordinato?

    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);
    		for(int i=0; i<a.length; i++)
    	}
    	
    	
    	public static void merge(int [] a, int left,int center, int right)
    	{
    		int [] S=new int[a.length-1];
    		int i= left;
    		int j=center+1;
    		int k=0;
    		
    		while(i<center && j<right)
    		{
    			if(a[i]<a[j])
    			{
    				S[k++]=a[i];
    				i=i++;
    			}
    			else if(a[i]>a[j])
    			{
    				S[k++]=a[j];
    				j=j++;
    			}
    		}
    		
    		while(i<center)
    		{
    			S[k++]=a[i];
    			i=i++;
    		}
    		
    		while(j<right)
    		{
    			S[k++]=a[j];
    			j=j++;
    		}
    		a=S;
    		
    	}
    	
    	
    	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);
    			
    		}
    	
    	}
    }

  6. #6
    Mi sapreste dare un suggerimento?

  7. #7
    la prima idea che mi viene in mente č quella di crearti un array momentaneo, contenente i valori in modo ordinato e poi stamparlo

  8. #8
    Pił esattamente dove lo inseriresti?
    In quale metodo?

    Sto provando ma...non riesco a metterlo e a farlo funzionare, perchč non lo trovano i metodi, ho le idee un pņ confuse..

  9. #9
    nel metodo che vuoi che te li stampi in ordine

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.