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:
Come è possibile una cosa del genere?