Seite 1 von 1

Liste Sortieren mit Rekursion und Protected Linked Lists

Verfasst: 05.02.2006 14:24
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                   

Verfasst: 05.02.2006 14:44
von MVXA
Arrays scheinen ja ByRef übergeben zu werden :shock:. Kann man
die auch irgendwie ByVal übergeben?

Verfasst: 05.02.2006 15:35
von HeX0R
@Franky:
Du weisst aber schon, dass PB seit 3.94 per SortList() bzw. SortStructuredList() pfeilschnell sortieren kann ?

Verfasst: 05.02.2006 15:38
von Franky
@HeXOR : Ja, der Sortieralgorithmus war halt nur das erste Beispiel, das mir einfiel ;)

Ich brauchte garkeine Sortierfunktion ;)

Verfasst: 05.02.2006 15:40
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:

Verfasst: 05.02.2006 17:10
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.

Verfasst: 05.02.2006 17:30
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.

Verfasst: 12.02.2006 01:26
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? ^^