Sortieren von Tabellen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Beitrag 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
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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> ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

BubbleSort ist einfach zu implementieren und eine stabile Sortierfunktion.

Infos findest du z.B. bei Wikipedia.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Beitrag 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
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag 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
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Antworten