Bubblesort in ST TwinCat 2

Hendrik

Level-1
Beiträge
219
Reaktionspunkte
19
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Formumgemeinschaft,

ich muss eine eingelesenes String Array Sortieren. Im Array diesem Array befinden sich Orndernamen immer mit dem gleichem Format yyyy_mm_dd.
Diese Informationen möchte ich mit BubbleSort nach Datum absteigend sortieren.

Ich bin soweit das ich das ich den Ablauf von BubbleSort verstanden habe. Ich wandle erst die String informationen in einen UINT-Wert um.
Die UINT-Werte möchte ich dann vergleichen.

Jetzt fehlt mir irgendwie die Idee wie ich das am Besten umsetzte.
Mein Ansatz ist folgender:
Code:
    FOR i := 0 TO 50 BY 1 DO
        IF DayUint [i] > DayUint[i+1] THEN
            DaySave :=DayUint [i];
            DayUint [i] := DayUint[i+1];
            DayUint[i+1] := DaySave;
        END_IF
        IF MonthUINT [i] > MonthUINT[i+1] THEN
            MonthSave :=MonthUINT [i];
            MonthUINT [i] := MonthUINT[i+1];
            MonthUINT[i+1] := MonthSave;
        END_IF
        IF YearUINT [i] > YearUINT[i+1] THEN
            YearSave :=YearUINT [i];
            YearUINT [i] := YearUINT[i+1];
            YearUINT[i+1] := YearSave;
        END_IF
    END_FOR

Jetzt soll das ganz durchgeführt werdern bis alle Werte absteigend sortiert werden und ich habe natürlich im moment auch das problem mit dem letztem Wert.


Hat jemand eine passende Lösung oder kann mir eine Idee liefern auf die ich heute (Montag morgen halt) noch nicht komme :p

Danke euch schoneinmal für jede Idee!

Mfg Hendrik
 
Hallo,
also erstmal solltest du die Schleife nur bis Anzahl_Elemente -1 laufen lassen - in deinem Fall also bis 49.
Dann :
Du sortierst im Augenblick deine Elemente einzeln - das ist doch sicher nicht so gewollt. Meiner Meinung nach müßte es eher so aussehen :
Code:
 FOR i := 0 TO 49 BY 1 DO
        doSort := false ;

        IF YearUINT [i] > YearUINT[i+1] THEN
            doSort := true ;
        elsif YearUINT [i] = YearUINT[i+1] THEN
            IF MonthUINT [i] > MonthUINT[i+1] THEN
               doSort := true ;
            elsIF MonthUINT [i] = MonthUINT[i+1] THEN
               IF DayUint [i] > DayUint[i+1] THEN
                  doSort := true ;
              END_IF ;
           END_IF ;       
        END_IF ;
  
        if doSort then
            YearSave :=YearUINT [i];
            YearUINT [i] := YearUINT[i+1];
            YearUINT[i+1] := YearSave;
            MonthSave :=MonthUINT [i];
            MonthUINT [i] := MonthUINT[i+1];
            MonthUINT[i+1] := MonthSave;
            DaySave :=DayUint [i];
            DayUint [i] := DayUint[i+1];
            DayUint[i+1] := DaySave;
        end_if ;
    END_FOR ;
Du hast sehr viele Semikolons vergessen ...!

Naja ... und jetzt macht das Ganze natürlich nur einen Durchlauf.
Du müßtest jetzt noch etwas da drum herum programmieren, dass das Ganze so oft wiederholt bis keine Umsortierungen mehr erfolgt sind ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry das mit n -1 habe ich auch schon rausgefunden mein BubbleSort schaut jetzt so aus und funktioniert auch.
Code:
FOR n := 0 TO 50 BY 1 DO
            FOR i := 0 TO 49 BY 1 DO
                IF DayUint [i] > DayUint[i+1] THEN
                    DaySave :=DayUint [i];
                    DayUint [i] := DayUint[i+1];
                    DayUint[i+1] := DaySave;
                END_IF;

                IF MonthUINT [i] > MonthUINT[i+1] THEN
                    MonthSave :=MonthUINT [i];
                    MonthUINT [i] := MonthUINT[i+1];
                    MonthUINT[i+1] := MonthSave;
                END_IF;

                IF YearUINT [i] > YearUINT[i+1] THEN
                    YearSave :=YearUINT [i];
                    YearUINT [i] := YearUINT[i+1];
                    YearUINT[i+1] := YearSave;
                END_IF;
            END_FOR;
        END_FOR;
Eine abfrage ist garnicht notwenidig wenn ich das einfach Anhand der Array größe durchlaufen lasse.

Andere Frage gibt es einen Trick Arraygrößen mehr oder Wenig dynamisch zuhalten oder Zentral die Größe ändern? im moment muss ich 10 mal die Arraygrenzen ändern wenn ich ein anderes Array vergleichen möchte.

MFG Hendrik
 
Nein Arraygrößen kannst du nicht dynamisch ändern. Wenn du deinen Sortieralgorithmus auf Arrays verschiedener Länge anwenden möchtest, kannst du aber mit Pointern Arbeiten. Du musst dann deinem FB die Adresse und Größe des Arrays und die Größe eines Feld-Elementes übergeben.
 
@Hendrik:
Ich glaube nicht, dass dein Sortierer korrekt funktioniert - es sei denn das Tag, Monat und Jahr nichts miteinander zu tun haben und einfach nur unzusammenhängend jeder für sich sortiert werden sollen. Vielleicht überprüfst du deinen Code doch noch mal mit verschiedenen Werten ... 8)
Und schau dich doch mal meinen Codeschnipsel an ...

Ansonsten : eine Schleife um die Schleife legen macht man eigentlich nicht. Da gehört eigentlich ein "Do ... Repeat until keineÄnderung" hin.
Das wäre dann "etwas" professioneller ...

Gruß
Larry
 
dein bubble sort geht nicht gut, es sortiert schon aber holt die daten ganz durch einander.
es soll nur wechseln wen alle daten hoher oder gleich sind.

wenn die datei ein string ist wie beschrieben dan geht es auch in einen gang also wen die string < string[i+1]ist dan umdrehen.
 
Zurück
Oben