Løsningsforslag - oppgaver i Avsnitt 1.5.11


Oppgave 1

  public static void kvikksortering(int[] a, int v, int h)
  {
    int k = Tabell.sParter(a, v, h, (v + h)/2);
    if (v < k - 1) kvikksortering(a,v,k-1);
    if (k + 1 < h) kvikksortering(a,k+1,h);
  }

OBS: Metoden over fungerer kun hvis intervallet a[v : h] har minst én verdi, dvs. vi må ha v <= h. Det kan være gunstig å lage en metode som sorterer en hel tabell:

  public static void kvikksortering(int[] a)
  {
    if (a.length > 2) kvikksortering(a,0,a.length-1);
  }

Oppgave 2

  public static int kvikksortering(int[] a, int v, int h)
  {
    int k = Tabell.sParter(a, v, h, (v + h)/2);
    int venstre = 0, høyre = 0;
    if (v < k - 1) venstre = kvikksortering(a,v,k-1);
    if (k + 1 < h) høyre = kvikksortering(a,k+1,h);
    return Math.max(venstre,høyre) + 1;
  }

Eksempel på programkjøring:

  int[] a = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  System.out.println("Antall lag: " + kvikksortering(a,0,a.length-1));
  Tabell.skrivln(a);

  int[] b = {1,4,6,8,10,12,14,15,2,9,5,11,3,13,7 };
  System.out.println("Antall lag: " + kvikksortering(b,0,b.length-1));
  Tabell.skrivln(b);

  // Utskrift:
  // Antall lag: 3
  // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  // Antall lag: 14
  // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Oppgave 3

  public static void kvikksortering2(int[] a)
  {
    if (a.length > 2) kvikksortering2(a,0,a.length-1);
  }

  public static void kvikksortering3(int[] a)
  {
    if (a.length > 2) kvikksortering3(a,0,a.length-1);
  }

Eksempel på testprogram:

  int n = 10;
  int[] a = Tabell.randPerm(n);
  Tabell.skrivln(a);
  kvikksortering2(a);
  Tabell.skrivln(a);

Oppgave 4

  public static void kvikksortering(int[] a, int v, int h)
  {
    while (v < h)
    {
      int k = Tabell.sParter(a,v,h,(v + h)/2);
      if (k + 1 < h) kvikksortering(a,k+1,h);
      h = k - 1;
    }
  }

Oppgave 5

  public static int middel(int[] a, int i , int j, int k)
  {
    if (a[i] <= a[j])
    {
      if (a[j] <= a[k]) return j;
      if (a[k] <= a[i]) return i;
      return k;
    }
    if (a[i] <= a[k]) return i;
    if (a[k] <= a[j]) return j;
    return k;
  }

  public static void kvikksortering1(int[] a, int v, int h)
  {
    while (v < h)
    {
    	int m = middel(a,v,(v+h)/2,h);
      int k = Tabell.sParter(a,v,h,m);
      if (v < k - 1) kvikksortering1(a,v,k-1);
      v = k + 1;
    }
  }

Oppgave 6

  int[] a = Tabell.randPerm(10000000);
  long tid = System.currentTimeMillis();
  kvikksortering(a); // eller kvikksortering(a,0,a.length-1);
  tid = System.currentTimeMillis() - tid;
  System.out.println(tid);