2012-03-23 6 views
1

Ich verwende Insertion sort, um eine Stringliste (EmailingListArray unten) zu sortieren. EmailingListArray[1] ist ein Array, das Namen enthält. EmailingListArray[2] enthält entsprechende E-Mails. Ich sortiere EmailingListArray[1] und wenn sich etwas darin ändert, ändert es auch das zweite Array, also werden sie zusammen sortiert. Eine unangenehme Art und Weise, Dinge zu tun, ich weiß, aber es ist für die Kursarbeit, und ich wollte eine Insertionsort in irgendwo setzen, um zu versuchen eine zusätzliche Markierung erhalten: LKann nicht finden, einfachen Fehler in Delphi Insertion Sort-Algorithmus

Hier ist mein Code

//quick check to make sure array contains correct values 
for first := 0 to EmailingListArray[1].Count do 
    ShowMessage(EmailingListArray[1][first]); 

//then sort 
First := 0; 
Last := EmailingListArray[1].Count; 
for CurrentPointer := First +1 to Last-1 do 
begin 
    CurrentValue := EmailingListArray[1][CurrentPointer]; 
    CurrentValue2 := EmailingListArray[2][CurrentPointer]; 
    Pointer := CurrentPointer + 1; 
    while ((EmailingListArray[1][Pointer] > CurrentValue) AND (Pointer > 0)) do 
    begin 
     EmailingListArray[1][Pointer+1] := EmailingListArray[1][Pointer]; 
     EmailingListArray[2][Pointer+1] := EmailingListArray[2][Pointer]; 
     pointer := Pointer -1; 
    end; 
    EmailingListArray[1][Pointer + 1] := CurrentValue; 
    EmailingListArray[2][Pointer + 1] := CurrentValue; 
end; 

    //show message at the end for a check 
    ShowMessage('hello?'); 

Die Meldung " Hallo?" wird aus irgendeinem Grund nicht angezeigt: S. Das Programm stürzt nicht ab oder so, es sollte wirklich "Hallo?" Am Ende. Es sortiert meine Arrays auch nicht. Ich bin auch nicht sicher, ob der Algorithmus richtig geschrieben ist, ich habe es aus unserem Lehrbuch. Jede Hilfe wäre sehr willkommen!

Antwort

3

Wenn Sie möchten, eine gute Note bekommen:

  1. Vermeiden Sie irreführende Namen für Ihre Variablen:

    • CurrentPointer sollte CurrentIndex oder CurrentPosition genannt werden, da es ein Index ist und kein Pointer
    • Pointer ist zu vermeiden (reserviert für Zeiger Typ) und mehr, weil es kein Zeiger ist; sollte es richtig
  2. Lese WorkIndex oder WorkPosition sein, um die Insertion Sortieralgorithmus (wikipedia hat einen einfachen Pseudo-Code für Array von 0 indexierten) und implementieren:

    WorkIndex := CurrentIndex - 1; // - not + in your "Pointer := CurrentPointer + 1;"

  3. Erhalten Sie Ihren Indexbereich from 0 to Count-1 für a TStrings.

  4. Verwechseln Sie nicht die 2-Arrays:
    EmailingListArray[2][WorkIndex + 1] := CurrentValue2; // not CurrentValue

Update: die schlechte verschossen, während Bedingung für Null basierten Array.

2bis. Während Zustand sollte mit> = 0 sein, nicht> 0

while ((EmailingListArray[1][WorkIndex] > CurrentValue) AND (WorkIndex >= 0)) do 
+0

Danke, seine Sortierung nun gut, nur ein Problem, es ist nicht die erste Sache zu sortieren. Denken Sie das ist, was Sie mit Punkt 3 gemeint haben, aber nicht sicher, was zu tun ist: S – JamesB123

+1

@ JamesB123, siehe mein Update ... –

+0

Danke Mann! Bin dankbar :) – JamesB123

Verwandte Themen