Løsningsforslag - oppgaver i Avsnitt 1.3.3


Oppgave 1

Tester metoden på samtlige 3628800 permutasjoner av tallene fra 1 til 10:

  int[] a = {1,2,3,4,5,6,7,8,9,10};
  do
  {
    int[] b = a.clone();
    Tabell.boblesortering(b);
    if (!Tabell.erSortert(b))  // Programkode 1.3.2 c)
    {
      System.out.println(Arrays.toString(b) + " er usortert!");
      break;
    }
  }
  while (Tabell.nestePermutasjon(a));  // Programkode 1.3.1 b)

Oppgave 2

Her er svaret helt avhengig av hvilken prosessor, operativsystem og versjon av Java en bruker. Da undertegnede sist testet koden under (hele tiden med Intel Core i7-7700, 3.60 GHz og Windows 10) var versjon 2 (den med færre gjennomganger) en del bedre enn versjon 1 med Java 8, men de var helt like med Java 10.

Java 8:  1. versjon ca.7 sek  2. versjon ca. 5 sek
Java 10: ca. 5 sek på begge
  int[] a = Tabell.randPerm(50000);        // en tilfeldig permutasjon
  int[] b = a.clone();                     // en kopi
  long tid = System.currentTimeMillis();   // leser av klokken
  Tabell.boblesortering1(a);               // sorterer a
  tid = System.currentTimeMillis() - tid;  // tidsforbruket
  System.out.println(tid);                 // skriver ut

  tid = System.currentTimeMillis();        // leser av klokken
  Tabell.boblesortering2(b);               // sorterer b
  tid = System.currentTimeMillis() - tid;  // tidsforbruket
  System.out.println(tid);                 // skriver ut    

Oppgave 3

  public static void boblesortering(int[] a)
  {
    for (int n = 0; n < a.length - 1; )
    {
      int byttindeks = a.length - 1;
      for (int i = a.length - 2; i >= n; i--)
      {
        if (a[i] > a[i + 1])
        {
          bytt(a, i, i + 1);
          byttindeks = i;
        }
      }
      n = byttindeks;
    }
  }

Oppgave 4

Oppgave 5

  public static double H(int n)
  {
    if (n < 1) throw new IllegalArgumentException("Må ha n >= 1");

    double sum = 1.0;
    for (int k = 2; k <= n; k++) sum += 1.0/k;
    return sum;
  }

  public static void main(String... args)
  {
    int n = 10;
    double Hn = H(n);

    double sum = 0.0;
    for (int k = 1; k < n; k++)
    {
      double ombyttinger = (n + k*(H(k) - Hn - 1));
      sum += ombyttinger;
      System.out.printf("%5.2f\n",ombyttinger);
    }
    System.out.println(sum + " " + n*(n-1)/4.0);
  }
Utskrift:
 7.07
 5.14
 3.71
 2.62
 1.77
 1.13
 0.65
 0.31
 0.10
22.5 22.5