Seite 2 von 2
Verfasst: 16.02.2006 15:01
von Mr.X
Erweitere Deine Structure um einen Sortierschlüssel. In diesen schreibst Du für das erste Sortierkriterium und hängst das zweite an.
Z.B. als String (Punkte und Sätze jeweils 2-stellig) "5365" für 53 Punkte und 65 Sätze
oder als Word/Long: Punkte*100+Sätze
Code: Alles auswählen
Structure Spieler
id.l
Name.s
Alter.w
Groesse.w
Punkte.l
Saetze.l
EndStructure
Dim Teilnehmer.Spieler(10)
Teilnehmer(0)\Name = "Pedro"
Teilnehmer(0)\Punkte = 10
Teilnehmer(0)\Saetze = 2
Teilnehmer(0)\Id = Teilnehmer(0)\Punkte*100 +Teilnehmer(0)\Saetze
Teilnehmer(1)\Name = "Miguel"
Teilnehmer(1)\Punkte = 50
Teilnehmer(1)\Saetze = 3
Teilnehmer(1)\Id = Teilnehmer(0)\Punkte*100 +Teilnehmer(0)\Saetze
Teilnehmer(2)\Name = "Miguela"
Teilnehmer(2)\Punkte = 50
Teilnehmer(2)\Saetze = 1
Teilnehmer(2)\Id = Teilnehmer(0)\Punkte*100 +Teilnehmer(0)\Saetze
Teilnehmer(3)\Name = "Sanchez"
Teilnehmer(3)\Punkte = 20
Teilnehmer(3)\Saetze = 20
Teilnehmer(3)\Id = Teilnehmer(0)\Punkte*100 +Teilnehmer(0)\Saetze
SortStructuredArray(Teilnehmer(), 1, OffsetOf(Spieler\Id, #PB_Sort_Long)
For I = 0 To 2
Debug Teilnehmer(I)\Name + " :: " + Str(Teilnehmer(I)\Punkte) + " :: " + Str(Teilnehmer(I)\Saetze)
Next
Generell gilt: Wenn die zu sortierende Tabellenspalte nicht als sortierschlüssel nicht eineindeutig ist muss ich mir einen eigenen eineindeutigen Sortierschlüsseln erstellen! (Informatikstudium 1. Semester, 2. Vorlesung - zumindest vor 20 Jahren)
eineindeutig heißt in der Mathematik/Informatik: Jeder Wert kommt nur maximal 1x vor.
Viel Erfolgt
Mr.X
Verfasst: 16.02.2006 15:19
von freedimension
Mr.X hat geschrieben:
Generell gilt: Wenn die zu sortierende Tabellenspalte nicht als sortierschlüssel nicht eineindeutig ist muss ich mir einen eigenen eineindeutigen Sortierschlüsseln erstellen! (Informatikstudium 1. Semester, 2. Vorlesung - zumindest vor 20 Jahren)
http://de.wikipedia.org/wiki/Stabiles_Sortierverfahren
<scherz>du hättest dein Studium nicht nach dem ersten Semester abbrechen sollen</scherz>

Verfasst: 16.02.2006 17:06
von NicTheQuick
BubbleSort ist einfach zu implementieren und eine stabile Sortierfunktion.
Infos findest du z.B. bei Wikipedia.
Verfasst: 16.02.2006 18:04
von freedimension
freedimension hat geschrieben:Mr.X hat geschrieben:
Generell gilt: Wenn die zu sortierende Tabellenspalte nicht als sortierschlüssel nicht eineindeutig ist muss ich mir einen eigenen eineindeutigen Sortierschlüsseln erstellen! (Informatikstudium 1. Semester, 2. Vorlesung - zumindest vor 20 Jahren)
http://de.wikipedia.org/wiki/Stabiles_Sortierverfahren
<scherz>du hättest dein Studium nicht nach dem ersten Semester abbrechen sollen</scherz>

Eine weitere Möglichkeit wäre übrigens eine extra Sortierfunktion zur Verfügung zu stellen, bei der der User seine eigene Vergleichsfunktion angeben kann.
Pseudocode:
Code: Alles auswählen
Procedure SortCompare(*a.MYSTRUCT, *b.MYSTRUCT)
If *a\title > *b\title
ProcedureReturn 1
ElseIf *b\title > *a\title
ProcedureReturn -1
Else
If *a\teaser > *b\teaser
ProcedureReturn 1
ElseIf *b\teaser > *a\teaser
ProcedureReturn -1
Else
ProcedureReturn 0
EndIf
EndIf
EndProcedure
USortStructArray(myarray(), @SortCompare())
Hatte ich Fred auch schon öfters vorgeschlagen, war ihm aber anscheinend nicht "pure" genug

Naja, ein einziger Wunsch der nicht umgesetzt wurde, das lässt sich verkraften. Mit der neuen Swap-Funktion sollte das Selberschreiben solch einer Funktion ja auch kein Beinbruch mehr darstellen.
Verfasst: 16.02.2006 23:22
von Mr.X
@ freedimension
hast Du eigentlich Oli's Frage genau gelesen. Von "Beibehalter der ursprünglichen Reihenfolge bei gleichem Sortierindex" ist dort gar keine Rede. Oli möchte lediglich nach 'Punkten' (=Spalte2) Sortieren und bei gleicher Punktzahl nach 'Sätzen' (=Spalte3). Also erweitern wir die Datenstruktur um einen eindeutigen Sortierschlüssel und sortieren nach diesem mit der PB-Sortierfuntion.
Warum zum Teufel soll ich das Sortieren neu implementieren, wenn ich vorhandene Funktionen durch sinnvolles Ergänzen der Datenstruktur nutzen kann.
Ich gebe Dir nur in sofern Recht, daß die PB-Sortierfunktionen KEIN stabiles Sortieren erlauben. Dafür bietet aber PB die Möglichkeit eigene Libs zu integrieren. Schreib Doch einfach eine solche Funktion, veröffentlcihe Sie in der PBOSL und alle sind glücklich.
MR.X
Verfasst: 17.02.2006 10:25
von freedimension
Mr.X hat geschrieben:hast Du eigentlich Oli's Frage genau gelesen. Von "Beibehalter der ursprünglichen Reihenfolge bei gleichem Sortierindex" ist dort gar keine Rede. Oli möchte lediglich nach 'Punkten' (=Spalte2) Sortieren und bei gleicher Punktzahl nach 'Sätzen' (=Spalte3). Also erweitern wir die Datenstruktur um einen eindeutigen Sortierschlüssel und sortieren nach diesem mit der PB-Sortierfuntion.
Ein stabiler Algorithmus ermöglicht es, zweimal hintereinander mit
unterschiedlichem Sortierindex zu sortieren, ohne dass die Reihenfolge der ersten Sortierung bei Gleichheit in der zweiten Sortierung verlorengeht.
Sowas in die Richtung würde also genau das machen, was du im zweiten Satz beschrieben hast, nur eben ohne die doppelte Datenhaltung. Dass das auch nicht optimal ist, ist klar, schließlich muss hierbei dann zweimal sortiert werden. Alles hat seine Vor- und Nachteile, die beste Lösung wäre aber meiner Ansicht nach tatsächlich die mit der benutzerdefinierten Vergleichsfunktion.
Verfasst: 17.02.2006 13:08
von PAMKKKKK
Der Horst Schaeffer hat sehr gute Quicksort Algorythmen geschrieben.

Kuck mal hier:
http://home.mnet-online.de/horst.muc/pb.htm
Damit kann man auch sehr leicht mehrfach sortieren.
QL Sort = Quick Sort für Linked Lists
QA Sort = Quick Sort für Arrays