Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: TMC am 28.02.05 - 14:00:06

Titel: LS Sortierroutine
Beitrag von: TMC am 28.02.05 - 14:00:06
Hi,

ich habe verschiedenes alphabetisch zu sortieren. Meist Textlisten / Arrays.

Nun hab ich mal irgendwo gesehen, dass ein Sortieralgorithmus nicht generell für alles geeignet ist.
Es gibt afaik einen Algorithmus, der nur für kleine Listen gut geeignet ist, da aber dann sehr schnell, dann gibt es wieder einen Algorithmus der nur für große Listen taugt.

Ich habe hier beides vorliegen: große und kleine Listen.

Ich habe hier nur den Shell - Sort:
Code
Public Function ArrayShellSort (vSource As Variant) As Variant
	On Error Goto ErrorHandler
	
	Dim vSortArray As Variant
	Dim bDone As Integer
	Dim lngPointer As Long
	Dim lngLoop1 As Long
	Dim lngLoop2 As Long
	Dim vTemp As Variant
	
	If Not Isarray(vSource) Or Isempty (vSource) Then
		ArrayShellSort = vSource
		Exit Function
	End If	
	
	vSortArray = vSource
	lngPointer = Ubound (vSortArray)
	
	'Algorithm by Donald Lewis Shell resp. Marlene Metzner
	While lngPointer > 0
		lngPointer = lngPointer \ 2
		Do
			bDone = True
			For lngLoop2 = 0 To Ubound (vSortArray) - lngPointer
				lngLoop1 = lngLoop2 + lngPointer
				If vSortArray (lngLoop2) > vSortArray (lngLoop1) Then
					vTemp = vSortArray (lngLoop1)
					vSortArray (lngLoop1) = vSortArray (lngLoop2)
					vSortArray (lngLoop2) = vTemp
					bDone = False
				End If
			Next
		Loop Until bDone
	Wend
	
	'Return the result
	ArrayShellSort = vSortArray
	
ExitScript:
	Exit Function
ErrorHandler:
	Call ErrorMsg("ArrayShellSort")
	Resume ExitScript
End Function

Was empfehlt Ihr für
a) kleine Listen
b) große Listen
?
Titel: Re: LS Sortierroutine
Beitrag von: elajen am 02.03.05 - 13:44:52
Hallo,

für große Listen würde ich Quick-Sort empfehlen. Das läuft durch rekursive Funktionsaufrufe.

Für kleine Listen kannst Du auf das altbewährte Bubble-Sort zurückgreifen.

Gruß von Ekki.
Titel: Re: LS Sortierroutine
Beitrag von: Glombi am 02.03.05 - 13:52:18
Den Quicksort Algorithmus verwendet Lotus bspw. im NAB um die Gruppenmitglieder zu sortieren.

Den Code verwende ich so - leicht angepasst.

Der Aufruf ist
SortiertesArray = QuickSort(UnsortiertesArray)

Andreas
Titel: Re: LS Sortierroutine
Beitrag von: elajen am 02.03.05 - 14:40:36
Hatte ich vergessen. Bei mir auf der Webseite unter

http://lncctest/el_html/langner-e/snipdata.php?id=14

steht auch eine Klasse rum.

Gruß von Ekki

EDIT: -> natürlich ist  der Link: http://www.langner-e.de/snipdata.php?id=14

Titel: Re: LS Sortierroutine
Beitrag von: fritandr am 02.03.05 - 15:19:06
Hatte ich vergessen. Bei mir auf der Webseite unter

http://lncctest/el_html/langner-e/snipdata.php?id=13

steht auch eine Klasse rum.

Gruß von Ekki

Hallo Ekki,

der Link funktioniert leider nicht!

Gruß
fritandr
Titel: Re: LS Sortierroutine
Beitrag von: TMC am 02.03.05 - 23:35:03
OK, danke schonmal für Euer Feedback.

Der Link zu Ekki sollte wohl so sein: http://www.langner-e.de

Also was haben wir bisher:

Mein Ziel wäre eigentlich sowas wie:
"wenn Dein Array < xx Elemente ist dann nimm besser A, wenn .... dann nimm B ...."

Wenn es da noch keine Erkenntnisse gibt, muss ich wohl selber ausprobieren mit "Stoppuhr". Ich glaub es gibt da ja auch noch mehr Algorithmen, die auch schon in LS umgesetzt wurden. Vielleicht sollte ich die auch mal via Google rausziehen.

Quicksort ruft sich rekursiv selbst auf. Hmm, weiß nicht, aber ist dann vielleicht für kleine Arrays nicht sooo geeignet.

Zwischenfazit von Ekki ja schon:
Zitat
für große Listen würde ich Quick-Sort empfehlen. Das läuft durch rekursive Funktionsaufrufe.

Für kleine Listen kannst Du auf das altbewährte Bubble-Sort zurückgreifen.
Titel: Re: LS Sortierroutine
Beitrag von: TMC am 02.03.05 - 23:42:11
Hmm, eigentlich will ich ja eine Weiche.

Also je nach Array.Count in die entsprechende Sub-Routine gehen.  :D

Natürlich nur wenn sich das performancemäßig lohnt. ::)
Titel: Re: LS Sortierroutine
Beitrag von: Glombi am 02.03.05 - 23:42:41
In der Script Library die ich angehängt habe wird der QuickSort nur für Arrays mit mehr als 10 Elementen gemacht. Kleinere werden nur mit dem Insertion Sort bearbeitet.

Andreas
Titel: Re: LS Sortierroutine
Beitrag von: TMC am 02.03.05 - 23:47:26
Upps, sorry, Andreas, nicht mal richtig angesehen  :-[

Zitat
' Only do the QuickSort if the sublist is at least 10 items long

Da ist also schon die Weiche  :D

Klingt sehr vernünftig, Deine Routine. Der Wert 10 irgendwie auch.

Danke.
Titel: Re: LS Sortierroutine
Beitrag von: koehlerbv am 02.03.05 - 23:58:26
Irgendwie eine sehr theoretische Geschichte mit dieser Weiche. Messt mal die Zeiten, wenn das Array kleiner 10 oder kleiner 100 ist und NICHT verzweigt wird gegenüber der Verzweigung.

Bernhard
Titel: Re: LS Sortierroutine
Beitrag von: Glombi am 03.03.05 - 00:04:40
Ich muss gestehen, dass ich mir bis dato noch keine Gedanken darüber gemacht habe und es so von Lotus übernommen habe.
Da es in meinen Anwendungen relativ flott geht, bin ich damit zufrieden.

Andreas
Titel: Re: LS Sortierroutine
Beitrag von: Semeaphoros am 03.03.05 - 08:32:50
Naja, mit 10 Elementen wird man in der Regel auch keine riesigen Unterschiede feststellen können, egal wie man sortiert. Und die Bemerkung von Bernhard ist schon richtig, es ist noch nicht einmal gesagt, dass man die Kosten für die IF-Abfrage dann wieder reinbekommt.

Matthias: Ich denke mal, wenn sich das durch eine einfache Abfrage entscheiden liesse, würde man das in der Sort-Literatur, die es wie Sand am Meer gibt und immer mal wieder als Vorlesungsthema auch auftaucht, finden. Die Sache ist deutlich komplexer als nur gerade von der Grösse der Datenmenge abhängig. Da spielen dann noch Sachen hinein wie Datentyp, Datengrösse pro Record, wie effizient kann die gewählte Sprache mit diesen Elementen beim Austauschen von Plätzen umgehen, und den allergrössten Einfluss hat in der Regel die Frage, wie kommt die Datenmenge daher: Vorsortiert, oder allenfalls sogar verkehrt rum sortiert oder rein zufällig. Diese letzte Frage beeinflusst die Sortierkosten weit mehr als die reine Datenmenge. Kurz gesagt, die Berechnung des O (Effizienz des Algorithmus') ist im Falle eines Sorts alles andere als trivial.
Titel: Re: LS Sortierroutine
Beitrag von: Glombi am 03.03.05 - 08:59:56
Das habe ich gerade bei meiner Google Suche gefunden. Als Einstieg ganz gut, da gibt es auch die O-Abschätzungen für die verschiedenen Sortieralgorithmen.

Wer Lust und Zeit hat, kann das ja in LotusScript programmieren und hier posten  ;)
Die Gemeinschaft wird sich freuen!

http://www.quick-sort.de/refqsort_1.htm

Andreas
Titel: Re: LS Sortierroutine
Beitrag von: Marinero Atlántico am 03.03.05 - 09:32:42
... vielleicht ein bischen out-of-topic.
Aber warum sind Sortieralgorythmen nicht einfach direkt Bestandteil der Sprache?
Sowas wie function doQuickSort(inPutArray, Comparator) oder function  doBubbleSort(inPutArray, Comparator).
Comparator ist dann sowas wie alphanumerisch sortieren oder nach zahlen sortieren.
Bei alphanumerisch sortieren wird dann der eingestellte Locale genommen.
Für Spezialsoritierungen kann man ein eigenes Comparator-Objekt erstellen.
Gehört es zum Skillset eines Anwendungsentwicklers, sich um solche letzten Endes wirklich komplexen (s. Beitrag Jens) Details zu kümmern? Ist das effizient, dass er sich darum kümmern muß? Sollten nicht zumindest ein paar Hilfen bereitgestellt werden, die zumindest 80% der Fälle erschlagen?

Gruß Axel
Titel: Re: LS Sortierroutine
Beitrag von: Semeaphoros am 03.03.05 - 10:06:56
Stimmt, Axel, da scheinen Traditionen hoch gehalten zu werden. Wenn einem das eingebaute nicht passt, kann mans ja immer noch anders machen. Aber im Prinzip meinst Du

@Sort

und insbesondere den kaum bekannten

@sort([customsort]), der enorm mächtig ist.
Titel: Re: LS Sortierroutine
Beitrag von: Marinero Atlántico am 03.03.05 - 11:17:52
... vielleicht ist das sogar effizienter, wenn man diese Formelsprachenbefehle in LotusScript einbindet als selber was basteln.
Sollte man mal benchmarken. 
Jedenfalls sind Algorythmen ein wirklich in jeder Hinsicht komplexes Thema. Besitze Algorithms in Java von Sedgewick und das ist nix, was man so nebenbei mal lesen kann.
Ich hab auch schon von Fällen gehört, wo der in Objekten direkt implementierte Sortieralgorythmus zu inperformant ist. Solche Fälle sind aber eher selten.
In Notes 8 (Eclipse basiert) sind in vielen SWT/JFace widgets Sortieralgoritmen auch direkt eingebaut. Man braucht also noch nicht mal mehr die klassischen java.util.Arrays.sort() oder java.util.Collections.sort().
Unser Backend Team ist ziemlich angetan von den bereitgestellten Möglichkeiten.

Axel
Titel: Re: LS Sortierroutine
Beitrag von: Glombi am 03.03.05 - 11:23:20
Wo kann ich mir Notes 8 anschauen ?
Nachdem Notes 7 ja schon eine Weile da ist wird es langweilig  ;D

Andreas
Titel: Re: LS Sortierroutine
Beitrag von: Marinero Atlántico am 03.03.05 - 11:55:31
Wo kann ich mir Notes 8 anschauen ?
http://www.eclipse.org

Um mit den Klitschkos zu sprechen:
Manche handeln eben aus dem Bauch heraus und essen was gerade zufällig im Kühlschrank ist. 
Andere denken eben mehr strategisch (ohne das Operative zu vergessen).

Ihr wisst das ich das nicht böse meine und braucht nicht weiter zu diskutiert werden.   ;)

Kann nicht mal bitte jemand:
- ein paar von diesen Sortieralgorythmen proggen (ich würds machen, aber ich hab diese Woche ca. 60 Stunden von denen nur 10 Private Fortbildung sind).
- sich überlegen wie wir das benchmarken können (gerade auhc diese @Sort Funktion

Gruß Axel

Titel: Re: LS Sortierroutine
Beitrag von: TMC am 03.03.05 - 22:41:28
Ich hab mir jetzt mal ein wenig I'net-Artikel angesehen, so wie es aussieht gehört QuickSort wirklich zu den schnelleren Algorithmen (so unter'm Strich), außer eben bei wenigen Daten.
Aber selbst wenn es sehr wenige Elemente sind, ist Quicksort wohl immer noch schnell genug für die allermeisten Fälle und eine Weiche nicht notwendig.
Daher nehme ich nun generell Quicksort und gebe der Routine noch ein Flag mit (Boolean: SortDescending).
Bei Sonderfällen muss man sich eh mit der Materie tiefer auseinandersetzen.

Aber Axel/Jens: Ihr habt Recht. Warum soll man sich als Programmierer überhaupt über sowas Gedanken machen müssen?
Ich finde in ND6 die verfügbaren Funktionen - im Vergleich zu anderen Programmiersprachen - sehr bescheiden, insbesondere auch bei Arrays - auch wenn da von R5 auf ND6 ein paar Dinge dazukamen (wie eben z.B. ReplaceSubstring, Implode, Explode, Unique). Da gilt IMHO auch nicht, dass man mit Evaluate ein paar Dinge von der Formelsprache nutzen kann.
Titel: Re: LS Sortierroutine
Beitrag von: Semeaphoros am 04.03.05 - 00:07:54
Nun, mit 2 log 2 für O ist Quichsort ganz nahe am theoretisch möglichen Bestwert, was ja auch in dem von Andreas G verlinkten Artikel drinsteht. Enorm schwer, das zu unterbieten, mit Ausnahme von Spezialfällen, wie teilsortierte oder teilweise vorsortierte Listen.