Liste Sortieren mit Rekursion und Protected Linked Lists

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Liste Sortieren mit Rekursion und Protected Linked Lists

Beitrag von Franky »

Hi Leute. :)

Als ich gestern im Changelog von PB 4.0 gelesen habe:
Support for Global, Protected, Static and Shared arrays and linkedlist: "Global NewList MyList.l()". NewList alone does not make the list global anymore


und heute dann auch auf :
LinkedList and Arrays can now be passed as procedure parameters
gestoßen bin, habe ich mal ein kleines Programm zum Sortieren von LinkedLists geschrieben.
Der Algorithmus ist an sich nicht auf meinen Mist gewachsen, den kenn ich aus der Schule von Delphi. Ich wollte nur mal eben zeigen, was mit den neuen Features so alles schönes möglich ist.

Code: Alles auswählen

Global NewList Werte.l()


Procedure MySort(List.l())
Protected NewList   leftList.l()
Protected NewList   rightList.l()
          FirstElement(List())
          If CountList(list())>1
                  mittwert.l=list()
                  DeleteElement(list(),1)
                  While CountList(list())<>0              
                          If list()<mittwert 
                                AddElement(LeftList.l())
                                         leftlist()=list()
                          Else 
                                AddElement(rightList.l())
                                         rightlist()=list()
                          EndIf
                          DeleteElement(list(),1)
                   Wend 
                      If CountList(leftlist())>1
                              FirstElement(leftList())
                              mysort(leftList())
                              ResetList(leftlist())                      
                              FirstElement(leftlist())          
                              While CountList(leftlist())>0            
                                    AddElement(List())
                                    list()=leftlist()
                                    DeleteElement(leftlist(),1)
                              Wend  
                      EndIf
                      AddElement(List())              
                      list()=mittwert
            
                      If CountList(rightlist())>1
                                FirstElement(rightlist())
                                mysort(rightlist())
                                FirstElement(rightlist())
                                While CountList(rightlist())>0            
                                      AddElement(List())
                                      list()=rightlist()
                                      DeleteElement(rightlist(),1)
                                Wend                      
                      EndIf 
          EndIf 
EndProcedure 

If OpenWindow(1,200,200,400,500,#PB_Window_SystemMenu,"Sortierer")
          CreateGadgetList(WindowID(1))
                   ListViewGadget(1,0,0,400,440)
                   ButtonGadget(2,0,450,500,50,"Sort")
                   For a=0 To 500
                          AddGadgetItem(1,-1,Str(Random(600)))
                   Next 
                   Repeat 
                       event=WaitWindowEvent()
                       If event=#PB_Event_Gadget
                              Select EventGadget()
                                 Case 2 
                                    ClearList(Werte())
                                    For a=0 To 500
                                         AddElement(Werte())
                                         Werte()=Val(GetGadgetItemText(1,a,0))
                                    Next
                                    ClearGadgetItemList(1)
                                    FirstElement(Werte())
                                    NextElement(werte())
                                    PreviousElement(werte())
                                    mysort(Werte())
                                    ForEach Werte()
                                         AddGadgetItem(1,-1,Str(werte()))
                                         DeleteElement(Werte())
                                    Next                                     
                              EndSelect
                       EndIf
                   Until event=#WM_CLOSE
EndIf                   
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Arrays scheinen ja ByRef übergeben zu werden :shock:. Kann man
die auch irgendwie ByVal übergeben?
Bild
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

@Franky:
Du weisst aber schon, dass PB seit 3.94 per SortList() bzw. SortStructuredList() pfeilschnell sortieren kann ?
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

@HeXOR : Ja, der Sortieralgorithmus war halt nur das erste Beispiel, das mir einfiel ;)

Ich brauchte garkeine Sortierfunktion ;)
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Wenn dir mal wieder langweilig is, ich hätte hier noch nen Sack voll 3.94er Source-Codes, die zu PB4 gewandelt werden möchten :mrgreen:
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

MVXA hat geschrieben:Arrays scheinen ja ByRef übergeben zu werden :shock:. Kann man
die auch irgendwie ByVal übergeben?
Kannst du doch per Hand in ein neues (in der Prozedur erstelltes) übergeben und dieses dann verändern.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Arrays ByVal zu übergeben ist aber ohnehin selten eine gute idee (wegen performance). ist vieleicht für eine basic sprache eine gute idee das nicht anzubieten. Java kommt auch ohne aus.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Wenn dir mal wieder langweilig is, ich hätte hier noch nen Sack voll 3.94er Source-Codes, die zu PB4 gewandelt werden möchten
Soll ich dir ne Preisliste schicken? ^^
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Antworten