Ho realizzato un classe statica che contiene vari metodi di ordinamento tra cui anche il MergeSort così realizzato:

codice:
// Metodi di utilita' su array.

public class ArrayUtils { 

[...]
    	
    	public static void mergeSort(int[] a, int primo, int ultimo){
    		int mezzo;
    		if(primo<ultimo){
    			mezzo = (primo+ultimo)/2;
    			mergeSort(a, primo, mezzo);
    			mergeSort(a, mezzo+1, ultimo);
    			merge(a, primo, ultimo, mezzo);
    		}//if
    	}//mergeSort
        
        private static void merge(int[] a, int primo, int ultimo, int mezzo){
        	//indici
        	int i,j,k,h;
        	//array di appoggio
        	int[] b = new int[a.length];
        	 i=primo;
        	 j=mezzo+1;
        	 k=primo;
        	 while((i<=mezzo)&&(j<=ultimo)){
        	 	if(a[i]<=a[j]){
        	 		b[k]=a[i];
        	 		i++;
        	 	}else{
        	 		b[k]=a[j];
        	 		j++;
        	 	}//else
        	 	k++;
        	 }//while
        	 j=k;
        	 for(h=i; h<mezzo; h++){
        	 	a[j]=a[h];
        	 	j++;
        	 }//for
        	 for(j=primo; j<(k-1); j++){
        	 	a[j]=b[j];
        	 }//for
        }//merge
    
}//ArrayUtils
ed ovviamente ho realizzato anche una classe per testare i metodi:

codice:
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.text.*;

 class ArrayUtilsTest {


  public static void main(String argv[]) {
  
  	//metodo per leggere un numero corretto da input
        Integer i;
        //numero elementi
        int Num;
        //indice
        int index;
        //lista di numeri interi;
        int[] list;
        
        while (true){
            try {
                String numero = JOptionPane.showInputDialog(null,"Inserisci la quantità di elementi.");
                i = new Integer(numero);
                break;
            } catch (NumberFormatException ex) { 
            	JOptionPane.showMessageDialog(null,"Devi inserire un numero intero!");
            }//catch
        }//while
        
        //converte un numero oggetto Integer in un numero intero
        Num = i.intValue();
        list = new int[Num];
        
  	for(index=0; index<Num; index++){
  		while (true){
                    try {
                        String numero = JOptionPane.showInputDialog(null,"Inserisci un numero intero.");
                        i = new Integer(numero);
                        break;
                    } catch (NumberFormatException ex) { 
                    	JOptionPane.showMessageDialog(null,"Devi inserire un numero intero!");
                    }//catch
                }//while
                list[index] = i.intValue();
  	}//for
  	ArrayUtils.mergeSort(list,0,list.length);
  	ArrayUtils.print(list);
        
  }//main
  
}//ArrayUtilsTest
ma quando vado ad eseguire il codice ho il seguente messaggio di errore:

codice:
C:\Programmi\Java\jdk1.5.0_09\bin\javaw.exe -classpath "C:\Documents and Settings\Giuseppe\Documenti\Java Source\ArrayUtilis" ArrayUtilsTest
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at ArrayUtils.merge(ArrayUtils.java:173)
	at ArrayUtils.mergeSort(ArrayUtils.java:160)
	at ArrayUtils.mergeSort(ArrayUtils.java:159)
	at ArrayUtilsTest.main(ArrayUtilsTest.java:49)
Process ArrayUtilsTest interrupted
la riga incriminata è la seguente:

codice:
if(a[i]<=a[j]){
Come è possibile una cosa del genere?