![]() |
Quicksort: Nur Nullen
Hallo, mein erster Post hier und ich komme mal gleich zur Sache :spin:
Ich brauche ein Programm, welches einen sortierten Array durch binäres Suchen nach der gewünschten Zahl durchsuchen soll. Soweit bin ich aber noch garnicht gekommen, weil mein Quicksort nur Nullen ausgibt oder ich einen anderen blöden Fehler drin habe, den ich einfach nicht finde. Dazu soll gesagt sein, dass ich noch nicht lange am Programmieren bin und mein Informathik-Lehrer ziemlich flott vorran geht ^^. Der Quicksort stammt aus einem Programm eines Mitschülers, in dessen Programm er wunderbar funktioniert, bei mir will er das jedoch nicht.
Delphi-Quellcode:
Das ist mein Quicksort und jetzt noch das Schreiben in den Array:
procedure quicksort(var arr : tZahlen; lo, hi : word);
procedure partition(var arr : tZahlen; lo, hi : word; var l, r : integer); var pivot, temp: word; begin l := lo; r := hi; pivot := arr[lo]; while l < r do begin if arr[r] > pivot then r := r-1 else if arr[l] <= pivot then l := l+1 else begin temp := arr[l]; arr[l] := arr[r]; arr[r] := temp; end; end; arr[lo]:= arr[r]; arr[r] := pivot; dec(r); inc(l); end; var l ,r : integer; begin partition(arr, lo, hi, l, r); if lo<r then quicksort(arr, lo,r); if l<hi then quicksort(arr, l,hi); end;
Delphi-Quellcode:
procedure TForm1.btSortClick(Sender: TObject);
var i, eingabe : word; begin memSort.lines.clear; eingabe := strtoint(edEingabe.Text); quicksort(arrZahlen2, low(arrZahlen2), high(arrZahlen2)); for i := 1 to eingabe do memSort.lines.add(inttostr(arrZahlen2[i])); end; Ich habe ein Feld, in welchem man angeben kann, wie viele Zufallszahlen erzeugt werden sollen, die dann sortiert werden. Kann auch sein, dass ich da einfach einen Fehler im übergeben des Arrays drin habe, aber irgendwie komme ich nicht drauf/übersehe es einfach. Wäre sehr dankbar, wenn mir jemand auf die Sprünge helfen könnte. Edit: Hätte noch ein kleines anderes Problem zu einem anderen Thema :mrgreen: Wie greift man auf den Wert eines Index in einem Array zu, wenn dieser Index aus mehreren Elementen besteht. Z.B. haben wir eine Telefonliste mit Nachname, Vorname und Telefonnummer in einer Zeile im Array und nun sollen wir den Array nach den Nachnamen sortieren. Wie greife ich also nur auf die Nachnamen im Array zu, ohne auch auf Vorname und Telefon zuzugreifen? |
Re: Quicksort: Nur Nullen
Hallo und willkommen im Forum!
Ist das Dein kompletter Quelltext? Wo füllst Du z.B. arrZahlen2 mit zufälligen Werten? |
Re: Quicksort: Nur Nullen
Hallo und herzlich Willkommen in der DP :hi:
Also dein Code funktioniert, hab ihn grade ausprobiert. Was ich mich vielmehr Frage: Wo füllst du den dein Array? Du hast in dem Btn-Click deine Variable eingabe, mit der du ja angeben können willst, wieviele Zufallszahlen erzeugt werden, aber wo schreibst du sie denn dann ins Array rein? MfG Benedikt //ups, roter Kasten... |
Re: Quicksort: Nur Nullen
Ohje, Ohje, wie blöd. Habe ich einfach ganz vergessen, dass ich den array2 noch nicht gefüllt hab :oops: Danke! :thumb:
|
Re: Quicksort: Nur Nullen
Hallo Runnic,
zu Deiner zweiten Frage: Du hast also einen array of string mit ungefähr folgenden Einträgen 1 Müller, willi 12345 2 Müller, Magdalena 2468 3 Schmitz, Peter 1357 Wenn das so aussieht, dann einfach das Array sortieren, da der Name ja vorne steht. Willst Du obiges Beispiel nach Vornamen sortieren, dann mußt Du den Vornamen nach vorne kopieren und dann sortieren. Deine Datensätze sehen dann ungefähr so aus: 1 willi|Müller, willi 12345 2 Magsdalena|Müller, Magdalena 2468 3 Peter|Schmitz, Peter 1357 Das "|" hab ich als Trenner genommen, damit Du einen einfach zu findenden Begrenzer für Deinen Sortierschlüssel hast. Aber ich würde für solche Daten Records, bzw. TLists verwenden, dann hat mein keine Probleme mit Begrenzern und dem Umkopieren. Gruß K-H |
Re: Quicksort: Nur Nullen
Moin, Moin.
Zitat:
|
Re: Quicksort: Nur Nullen
Zitat:
Zitat:
|
Re: Quicksort: Nur Nullen
Zitat:
Wir haben bis jetzt nur mit Arrays gearbeitet. Jetzt kamen noch die Records dazu, von denen unser Lehrer uns einen in ein vorgefertigtes Programm mit den Elementen vName,nName und telefon gesetzt hat und die Aufgabe ist es jetzt, den Array nach Nachnamen und untereinander nach Vornamen zu sortieren. EIne kleine Überlegung haben wir schon angestellt, und zwar, dass man erst nach Vornamen sortieren muss und dann nach Nachnamen. Der Array[1] sieht dann bsp so aus: Müller, Lisa, 0123/456789 Es kam noch etwas ganz kurz zur Sprache am Ende der Stunde, was ich aber nicht genau mitbekommen habe. Das waar glaube ich so etwas wie : array[i].vName, um beim index i im Array nur auf den Vornamen zuzugreifen. Ich habe das dann in meinem Programm kurz ausprobiert, indem ich dem Quicksort nicht array sondern array.vName übergeben wollte. Das wurde mir allerdings rot unterstrichelt: "tArrEintrag enthält kein Element namen vName"
Delphi-Quellcode:
In der Obenflächenunit:
procedure TFormTelefon.Button2Click(Sender: TObject);
var i : word; begin sortiere(arrEintrag.vName, low(arrEintrag), high(arrEintrag)); //warum?? for i := 1 to high(arrEintrag) do memArray.lines.add(arrEintrag[i]); end;
Delphi-Quellcode:
in uSort:
implementation
{$R *.dfm} uses uStore, uSort ; var arrEintrag : tArrEintrag; // <---
Delphi-Quellcode:
in uStore:
type tArrEintrag = array[1..100] of tEintrag;
Delphi-Quellcode:
tEintrag = record
vName: tVName; nName: tNName; telefon: tTelefon; end; Ich verstehe das jetzt als eine funktionierende "Kette". arrEintrag ist als tArrEintrag definiert, tArrEintrag mit tEintrag und in tEintrag steht vName?! :wiejetzt: |
Re: Quicksort: Nur Nullen
Zitat:
Dann sortierst du z.B. nach "MüllerLisa" und damit hast du Nach- und Vorname in einem Rutsch richtig sortiert. Zur Darstellung nimmst du die Felde dann wieder einzeln her. |
Re: Quicksort: Nur Nullen
Zitat:
Delphi-Quellcode:
Das sollte schon so funktionieren...
arrEintrag[i].vName
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz