class BinSucheRekMitObjekten
{ Visitenkarte[] feld;
  final int MAXINDEX=9999;
  Stoppuhr uhr;

  public BinSucheRekMitObjekten()
  { uhr = new Stoppuhr();  
    feld = new Visitenkarte[MAXINDEX+1];  
  }    
  
  public int ganzeZufallszahlMitRandwerten(int low, int high) 
  { high++;  
    return (int) (Math.random() * (high - low) + low);
  }
  
  public String zufallsname()
  { String ergebnis = "";
    int asciinr;
    char zeichen;
    for (int nr=0; nr<=5; nr++) // 6 Buchstaben langer Name
    {    asciinr = ganzeZufallszahlMitRandwerten(65, 70); // A bis F
         zeichen = (char)asciinr;
         ergebnis = ergebnis + zeichen;
    }
    return ergebnis;  
  }     
  
  public void feldFuellen()
  { String nachname;
    String vorname;  
     for (int i=0; i<=MAXINDEX; i++)
     {    nachname = zufallsname(); 
          vorname = zufallsname(); 
          feld[i] = new Visitenkarte(nachname, vorname, 
                    "02752-" + String.valueOf(ganzeZufallszahlMitRandwerten(1000, 9000)),
                    vorname + "." + nachname + "@" + "abc.de");              
     }  
  } // feldFuellen

  public void feldAusgabe()
  { Out.println("Das Feld enthaelt die folgenden Elemente: ");
    for (int i=0; i<=MAXINDEX; i++) 
    {    Out.print("An der Stelle " + i + " steht "); 
         feld[i].drucke(); 
    }
    Out.println();
  } // feldAusgabe

  public  void vertausche (int a, int b)
  {  String ablage = feld[a];
     feld[a] = feld[b];
     feld[b] = ablage;
  } // vertausche

  public void minsort()
  { int minpos;
    for (int i=0; i<=MAXINDEX; i++)
    { minpos = i;
      for (int k=i+1; k<=MAXINDEX; k++)
      {  if (feld[k] < feld[minpos]) 
              minpos = k;  // feld[k] < feld[minpos]
      } // for k
      if (minpos>i) 
           vertausche(i, minpos); 
    } // for i
  }  // minsort

  public int binaereSucheRekursiv(Visitenkarte karte, int low, int high)
  { 
     if (low <= high)
          {  int mitte = (low + high)/2;
             if (feld[mitte] ==karte)  // feld[mitte]==zahl
                  return mitte; 
             else if (feld[mitte] > karte) // links weiter;  feld[mitte]>zahl
                  return binaereSucheRekursiv(karte, low, mitte-1); 
             else return binaereSucheRekursiv(karte, mitte+1, high); 
          }
     else return -1;  // nicht gefunden
  }

  public void jetzt_mach_mal_was()
  { 
    Out.println("Binaere Suche: ");
    feldFuellen();
    Out.println("Erst mal sortieren: ");
    uhr.starte();
    minsort();
    uhr.stoppe();
    Out.println("Beginn der Suche:");
    feldAusgabe();
    String suchwort = "ABCDEF";
    Visitenkarte hilfskarte = new Visitenkarte(suchwort, "", "", "");
    int pos=binaereSucheRekursiv(hilfskarte, 0, MAXINDEX);
    if (pos>=0)
         { Out.println("Wort " + suchwort + " steht an Stelle " + pos );
           feld[pos].drucke();
         }
    else Out.println(suchwort + " wurde nicht gefunden.");

    Out.println("Zeit zum Sortieren: " + uhr.lies() + " ms.");
  } // main
} // class BinSucheRekMitObjekten

