/** array ordinato di numeri interi. @author Adriano Luchetta @version 7-Nov-2003 @version 20-Nov-2004 */ import java.util.NoSuchElementException; public class ArrayOrdinato { private int[] array; private int arraySize; public ArrayOrdinato() { array = new int[1]; arraySize = 0; } /** verifica se l'array è vuoto
Andamento asintotico O(1) @return true se l'array e' vuoto, false altrimenti */ public boolean vuoto() { return arraySize == 0; } /** Aggiunge un elemento all'array ordinato
Andamento asintotico O(n) (Prima dell'inserimento l'array e' ordinato!) @param n il numero intero da aggiungere */ public void aggiungi(int n) { // ridimensionamento dell'array if (arraySize == array.length) { int[] nuovoArray = new int[2 * array.length]; for (int i = 0; i < arraySize; i++) nuovoArray[i] = array[i]; array = nuovoArray; } // inserimento e ordinamento dell'array // (basta il ciclo interno dell'algoritmo di ordinamento per inserimento) int j; for (j = arraySize; j > 0 && n < array[j-1]; j--) array[j] = array[j - 1]; array[j] = n; arraySize++; } /** ritorna il valore massimo nell'array, cancellandolo dall'array
Andamento asintotico O(1) @return il valore massimo @throws NoSuchElementException se l'array e' vuoto */ public int togliMax() throws NoSuchElementException { if (vuoto()) throw new NoSuchElementException(); arraySize--; return array[arraySize]; } /** restituisce la media dei valori dell'array
Andamento asintotico O(n) @return la media */ public double media() { int somma = 0; for (int i = 0; i < arraySize; i++) somma += array[i]; return somma / (double) arraySize; } /** trova un numero nell'array ordinato (ricerca binaria)
Andamento asintotico O(log n) @param n l'intero da trovare @return l'indice nell'array dell'intero n se presente, -1 se assente */ public int trova(int n) { int da = 0; int a = arraySize - 1; while (da <= a) { int medio = (da + a) / 2; if (n == array[medio]) return medio; else if (n < array[medio]) a = medio - 1; else da = medio + 1; } return -1; } }