/** RICERCA BINARIA * INVARIANTE: inf >= 0 AND sup <= a.length - 1 AND se x č presente in a allora č presente nella porzione a[inf ... sup], cioč da inf a sup (inclusi). */ /** ricerca binaria, restituente un booleano */ public static boolean ricercaBin(int x, int[] a) { int i, inf = 0, sup = a.length - 1; while(inf <= sup) { i = (inf + sup)/2; if(x < a[i]) sup = i-1; else if(x > a[i]) inf = i+1; else return true; } return false; } /** ricerca binaria, restituente l'indice */ public static int ricercaBin(int x, int[] a) { int inf = 0, sup = a.length - 1; if(sup == -1 || x < a[0] || x > a[sup]) return -1; while(inf <= sup) { int i = (inf + sup)/2; if(x < a[i]) sup = i-1; else if(x > a[i]) inf = i+1; else return i; } return -1; }/** FUSIONE ORDINATA (MERGE) DI DUE ARRAY ORDINATI presi come argomenti due array ordinati (che possono contenere elementi ripetuti), crea e restituisce un nuovo array ordinato (eventualmente contenente elementi ripetuti) dato dalla fusione ordinata dei due array-argomenti (senza modificare tali array-argomenti) */ public static int[] fondi(int[] a, int[] b) { int m = a.length; int n = b.length; int[] c = new int[m+n]; int i = 0, j = 0; while(i < m && j < n) { if(a[i] <= b[j]) { c[i+j] = a[i]; i++; } else { c[i+j] = b[j]; j++; } } while(i < m) { c[i+j] = a[i]; i++; } while(j < n) { c[i+j] = b[j]; j++; } return c; }