Liste nach Größe der Einträge sortieren

Hallo liebes Forum,

durch Auslesen der Datenbasis habe ich eine Liste mit mehreren Einträgen erhalten. Die Liste ist nicht sortiert. Unsortiert ist die Liste jedoch unbrauchbar für mich. Da ich keinen Befehl gefunden habe, wie die Liste auf direktem Wege der Größe nach sortiert werden kann, habe ich mir folgenden Workaround überlegt.

+PROG TEMPLATE urs:1
KOPF Minimum bestimmen und Liste sortieren
DEL#MIN
DEL#SUMME
DEL#lidurcheinander
STO#lidurcheinander 0.5,0.0001,20,179.9898,0.00001,179.9899
LOOP#c lidurcheinander
LOOP#b lidurcheinander
LET#SUMME 0
LOOP#a lidurcheinander
LET#licheck(#a) 1
IF #lidurcheinander(#b) <= #lidurcheinander(#a) $ wenn es 1en gibt, ist der untersuchte Eintrag nicht das Minimum
LET#licheck(#a) 0
ENDIF
LET#SUMME #SUMME+#licheck(#a) $ Summe gibt an, wie viele kleinere Zahlen es gibt
ENDLOOP
prt#SUMME
IF #SUMME == 0
LET#MIN #lidurcheinander(#b) $Minimum aus Liste
LET#INDEX #b $gibt Platz des Minimums in der Liste an
prt#MIN
prt#INDEX
ENDIF
ENDLOOP
LET#liordered(0+#c) #lidurcheinander(#INDEX)
LET#lidurcheinander(#INDEX) 200 $ Winkelliste hat Werte zwischen 0-180, Wert ist auf keinen Fall das Minimum, Löschen des Eintrags geht nicht, da ein LOOP über die Liste geschrieben ist
ENDLOOP
prt#liordered
ENDE

An und für sich funktioniert es, jedoch wird dieser Workaround bei großen Listen (> 600 Einträge) aufgrund der Verschachtelung unbrauchbar, da die Rechenzeit viel zu groß wird. Daher meine Frage: Gibt es elegantere Lösungen als die vorgeschlagene, eine Liste der Größe nach zu sortieren?

Ich freue mich sehr über Eure Antworten

Viele Grüße
Kai

Wie so oft muss man die Frage nur stellen, um selber zur Lösung zu kommen.

+PROG TEMPLATE urs:2
KOPF Minimum bestimmen
DEL#MIN
DEL#SUMME
DEL#lidurcheinander

LOOP#a 300
LET#lidurcheinander(#a) RANDOM(1)
ENDLOOP
prt#lidurcheinander

$STO#lidurcheinander 19,13,16,15
LOOP#a lidurcheinander
LET#nli #a+1
ENDLOOP
LOOP#c lidurcheinander
LET#MIN #lidurcheinander(0)
LOOP#a #nli-1 $ (#lidrcheinander-1)
LET#MIN MIN(#MIN,#lidurcheinander(1+#a))
ENDLOOP
prt#min
LOOP#a lidurcheinander
IF #lidurcheinander(#a) == #MIN
LET#INDEX #a
ENDIF
ENDLOOP
prt#index
LET#liordered(#c) #lidurcheinander(#INDEX)
LET#lidurcheinander(#INDEX) 200 $ Winkelliste hat Werte zwischen 0-180, Wert ist auf keinen Fall das Minimum, Löschen des Eintrags geht nicht, da ein LOOP über die Liste geschrieben ist
ENDLOOP
prt#liordered
ENDE

Hiermit funktioniert es problemlos. Das bestimmen den Minimums habe ich über den MIN-Befehl abkürzen können, so war die Verschachtelung nicht notwendig. Vielleicht hilft es ja jemandem weiter. :blush:

Viele Grüße
Kai

1 Like