Løsningsforslag - oppgaver i Avsnitt 5.1.9


Oppgave 1

Utskriften blir: 8 18 5 10 20 11 3 13 7 14

Oppgave 2

  Integer[] p = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,23,26,27,29};

  Tabell.innsettingssortering(p,
    Comparator.comparing(Integer::toBinaryString).reversed());

  for (int k : p) System.out.print(k + " ");
  // Utskrift: 29 14 7 27 26 13 12 6 3 23 11 21 10 5 19 18 9 17 8 4 2 1

Oppgave 3

  Integer[] p = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,23,26,27,29};

  Comparator<Integer> c = (x,y) ->
  {
    int a = x, b = y;                    // bruker int-format

    int m = Integer.highestOneBit(a);    // første 1-biten i a
    int n = Integer.highestOneBit(b);    // første 1-biten i b

    while (m > 0 && n > 0)
    {
      if ((m & a) == 0 && (n & b) != 0) return -1;      // 0 i a, 1 i b
      else if ((m & a) != 0 && (n & b) == 0) return 1;  // 1 i a, 0 i b

      m >>= 1; n >>= 1;       // flytter m og n
    }
    return m - n;    // n = 0 -> b forfeder til a, m = 0 -> omvendt
  };

  Tabell.innsettingssortering(p, c);
  for (int k : p) System.out.print(k + " ");
  // Utskrift: 1 2 4 8 17 9 18 19 5 10 21 11 23 3 6 12 13 26 27 7 14 29

Oppgave 4

Den eneste forskjellen fra løsningen på Oppgave 3 er at fortegnet snus i den siste return-setningen, dvs. return n - m; istedenfor return m - n;

  Integer[] p = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,23,26,27,29};

  Comparator<Integer> c = (x,y) ->
  {
    int a = x, b = y;                    // bruker int-format

    int m = Integer.highestOneBit(a);    // første 1-biten i a
    int n = Integer.highestOneBit(b);    // første 1-biten i b

    while (m > 0 && n > 0)
    {
      if ((m & a) == 0 && (n & b) != 0) return -1;      // 0 i a, 1 i b
      else if ((m & a) != 0 && (n & b) == 0) return 1;  // 1 i a, 0 i b

      m >>= 1; n >>= 1;       // flytter m og n
    }
    return n - m;    // n = 0 -> b forfeder til a, m = 0 -> omvendt
  };

  Tabell.innsettingssortering(p, c);
  for (int k : p) System.out.print(k + " ");
  // Utskrift: 17 8 18 19 9 4 21 10 23 11 5 2 12 26 27 13 6 29 14 7 3 1

Oppgave 5

  Integer[] p = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,23,26,27,29};

  Comparator<Integer> c = (a, b) ->
  {
    String s = Integer.toBinaryString(a);
    String t = Integer.toBinaryString(b);

    int m = Math.min(s.length(), t.length());

    for (int i = 0; i < m; i++)
    {
      int k = s.charAt(i) - t.charAt(i);
      if (k != 0) return k;
    }
    return t.length() - s.length();
  };

  Tabell.innsettingssortering(p, c);
  for (int k : p) System.out.print(k + " ");
  // Utskrift: 17 8 18 19 9 4 21 10 23 11 5 2 12 26 27 13 6 29 14 7 3 1

Oppgave 6

  Integer[] p = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,21,23,26,27,29};

  Comparator<Integer> c = (x,y) ->
  {
    int a = x, b = y;                    // bruker int-format

    int m = Integer.highestOneBit(a);    // første 1-biten i a
    int n = Integer.highestOneBit(b);    // første 1-biten i b

    while (m > 0 && n > 0)
    {
      if ((m & a) == 0 && (n & b) != 0) return -1;      // 0 i a, 1 i b
      else if ((m & a) != 0 && (n & b) == 0) return 1;  // 1 i a, 0 i b

      m >>= 1; n >>= 1;       // flytter m og n
    }

    return m > 0 ? ((m & a) == 0 ? -1 : 1) : ((n & b) == 0 ? 1 : -1);
  };

  Tabell.innsettingssortering(p, c);
  for (int k : p) System.out.print(k + " ");
  // Utskrift: 8 17 4 18 9 19 2 10 21 5 11 23 1 12 6 26 13 27 3 14 29 7