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. ;)

Code: Alles auswählen

StableSort(a(), Spalte3)
StableSort(a(), Spalte2)
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. :allright:
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