Løsningsforslag - oppgaver i Avsnitt 1.2.14


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
  }