Oppgave 1
// Obs. Tidligere har vi funnet posisjonene til minste og // største verdi i en heltallstabell. Flg. metode returnerer // verdiene og ikke posisjonene. I tillegg gjør den permanente // endringer i tabellen a public static int[] minmaks(int[] a) { int i = 0, j = a.length - 1; // Vi sammenligner den første og den siste, // deretter den andre og den nest siste, osv. Ved // ombytting ordner vi det slik at alle "taperne" // kommer i første halvdel av tabellen, og "vinnerne" // i andre halvdel while (i < j) { if (a[i] > a[j]) bytt(a,i,j); i++; j--; } // Vi ønsker at i danner grensen for taperne, // dvs. taperne ligger til venstre for posisjon i // Hvis i == j må vi avgjøre om tilhørende verdi // skal høre med på vinner- eller tapersiden if (i == j) { if (a[i] < a[i+1]) i++; } int[] b = {a[min(a,0,i)],a[maks(a,i,a.length)]}; return b; }
Oppgave 2
// Parameterverdien k er slik at hvis k == 0, // returneres den minste verdien i tabellen, // hvis k == 1, den nest minste, hvis k == 2, // den tredje minste, osv. // a) Løsning basert på ideen i Programkode 1.2.4 a). // Obs. metoden gjør permanente endringer i a public static int kVerdi(int[] a, int k) { // tabellen må ha minst k + 1 verdier if (a.length < k + 1 || k < 0) throw new IllegalArgumentException("Ulovlig verdi på k!"); for (int i = 0; i <= k; i++) { int m = Tabell.min(a,i,a.length); Tabell.bytt(a,i,m); } return a[k]; // den k-te verdien } // b) Løsning basert på ideen i Programkode 1.2.5 a). // Obs. metoden gjør permanente endringer i a public static int kVerdi(int[] a, int k) { // tabellen må ha minst k + 1 verdier if (a.length < k + 1 || k < 0) throw new IllegalArgumentException("Ulovlig verdi på k!"); // sorterer a[0:k] Arrays.sort(a,0,k+1); // fra java.util for (int i = k+1; i < a.length; i++) { if (a[i] < a[k]) { int j = k-1; for (; j >= 0 && a[i] < a[j]; j--) a[j+1] = a[j]; a[j+1] = a[i]; } } return a[k]; // den k-te verdien }