Autor Thema: LS Sortierroutine  (Gelesen 8011 mal)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
LS Sortierroutine
« 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
?
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


elajen

  • Gast
Re: LS Sortierroutine
« Antwort #1 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.

Glombi

  • Gast
Re: LS Sortierroutine
« Antwort #2 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

elajen

  • Gast
Re: LS Sortierroutine
« Antwort #3 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

« Letzte Änderung: 03.03.05 - 13:50:38 von elajen »

Offline fritandr

  • Global Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 742
  • Geschlecht: Männlich
  • Höre nie auf besser zu werden...
    • KAMMACHI Consulting GmbH
Re: LS Sortierroutine
« Antwort #4 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
Andreas Fritz

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: LS Sortierroutine
« Antwort #5 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:
  • Shell - Sort
  • Bubble-Sort
  • Quicksort (verwendet Lotus bspw. im NAB um die Gruppenmitglieder zu sortieren)

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.
« Letzte Änderung: 02.03.05 - 23:38:16 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: LS Sortierroutine
« Antwort #6 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. ::)
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Glombi

  • Gast
Re: LS Sortierroutine
« Antwort #7 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

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: LS Sortierroutine
« Antwort #8 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.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: LS Sortierroutine
« Antwort #9 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

Glombi

  • Gast
Re: LS Sortierroutine
« Antwort #10 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

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: LS Sortierroutine
« Antwort #11 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.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Glombi

  • Gast
Re: LS Sortierroutine
« Antwort #12 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

Marinero Atlántico

  • Gast
Re: LS Sortierroutine
« Antwort #13 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

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: LS Sortierroutine
« Antwort #14 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.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Marinero Atlántico

  • Gast
Re: LS Sortierroutine
« Antwort #15 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

Glombi

  • Gast
Re: LS Sortierroutine
« Antwort #16 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

Marinero Atlántico

  • Gast
Re: LS Sortierroutine
« Antwort #17 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


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: LS Sortierroutine
« Antwort #18 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.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: LS Sortierroutine
« Antwort #19 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.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz