Løsningsforslag - oppgaver i Avsnitt 1.5.7


Oppgave 1

  private static void kvikksortering1(int[] a, int v, int h)
  {
    System.out.println("a[" + v + ":" + h + "] legges på stakken");

    int p = Tabell.sParter(a, v, h, (v + h) / 2);  // bruker midtverdien
    if (v < p - 1) kvikksortering1(a, v, p - 1);    // sorterer intervallet a[v : p - 1]
    if (p + 1 < h) kvikksortering1(a, p + 1, h);    // sorterer intervallet a[p + 1 : h]
  }

  public static void kvikksortering(int[] a) // sorterer hele tabellen
  {
    if (a.length > 1) kvikksortering1(a, 0, a.length - 1);
  }

Oppgave 2

Det spiller ingen rolle for sorteringens skyld i hvilken rekkefølge kallene skjer. Men det kan være gunstig å gjøre det rekursive kallet på det intervallet som er minst først. Det vil gjøre at antall kall som legges på programstakken aldri vil bli større enn log2(n) der n er tabellens lengde.

Oppgave 3

La tabellen a = {2,4,6,8,10,5,3,7,1,9}. Da vil a[v:k-1] for hvert nytt rekursivt kall bli:

2 4 6 8 9 5 3 7 1
2 4 6 8 1 5 3 7
2 4 6 7 1 5 3
2 4 6 3 1 5
2 4 5 3 1
2 4 1 3
2 3 1
2 1
1