AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mergesort einmal anders.

Ein Thema von MacGuyver · begonnen am 13. Aug 2004 · letzter Beitrag vom 13. Aug 2004
Antwort Antwort
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#1

Mergesort einmal anders.

  Alt 13. Aug 2004, 12:31
Moin auch!

Ich habe mir den Eintrag "Wie kann ich Mergesort einsetzten?" angetan. Dabei ist mir aufgefallen, daß das Teil rekursiv arbeitet. Unterm Strich ist das doch voll Quatsch, braucht doch nur Zeit. Im letzten Verschmelzungsvorgang benötigt man noch einmal genauso viel Speicher wie für die zu sortierenden Daten.

Hat jemand sich damit auseinander gesetzt? Kann man noch schneller sortieren?
Ich habe ein XMS-Object geschrieben, das vorher den Quicksort verwendete. Ich habe gestaunt, daß Mergesort nur 80% der Zeit benötigte.


Stefan



Also, ganz einfach: Man holt sich den erwähnten Speicher, doppelt so viel wie die zu sortierenden Daten. Jetzt braucht man nur noch eine Schleife zu durchlaufen und schon ist alles sortiert. Ok, das war zu schnell. Im ersten Durchgang nimmt man immer nur ein Zeichen, links und rechts. Das wären die Positionen 0 und 1. Die beiden verschmilzt man und fährt mit 2 und 3 fort. Das nun komplett durch. Als nächster Durchgang wird das mit jeweils 2 Zeichen und dann mit 4 etc. gemacht. Wenn er mehr oder gleich viel Zeichen wie die Gesamtmenge verschmilzen will, ist der vorgang zu Ende.

Verschmilzen:
Es sind immer zwei sortierte Listen die miteinander verschmilzt werden. Hier findet auch die eigentliche Sortierung statt. Nehmen wir den dritten Durchgang des Beispiels unten vor:

Code:
   1  0
   2  5 
   3  7
  15  9
Es werden beide Spalten abwechselnd durchlaufen, je nach Daten. Erst die 0 von rechts, die ist kleiner als die 1 von links. Dann die 1 von links, die 5 rechts ist größer.
Problematisch werden dann die Sonderfälle, daß die eine Seite keine oder weniger Daten hat.
Das Ergebnis beim Verschmelzen kommt dann vom ersten in den zweiten Speicher. Beim nächsten
Durchgang wird dann wieder vom zweiten Speicher in den ersten Speicher verschmolzen. Wenn der Algo rekursiv läuft, muß man immer wieder die Daten zurück kopieren, was unnötig Zeit benötigt. Ist am Ende nur zu prüfen, wo das Ergebnis gerade ist.

Code:
#     15  2    3  1    5  0    7  9    8 11   12 14   13  4    6 10 
#     -----   -----   -----   -----   -----   -----   -----   -----
#      2 15    1  3    0  5    7  9    8 11   12 14    4 13    6 10 
#      -----------     -----------     -----------     ----------- 
#       1  2  3 15      0  5  7  9      8 11 12 14      4  6 10 13
#        -----------------------         -----------------------
#         0  1  2  3  5  7  9 15          4  6  8 10 11 12 13 14
#            -----------------------------------------------
#             0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
Nach vier Durchgängen ist der Datenpool sortiert. Es dauert immer gleich lange. So kann man beim Mergesort auch einen Progressbar mitlaufen lassen.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Mergesort einmal anders.

  Alt 13. Aug 2004, 18:28
Zitat von MacGuyver:
Nach vier Durchgängen ist der Datenpool sortiert. Es dauert immer gleich lange. So kann man beim Mergesort auch einen Progressbar mitlaufen lassen.
Soweit ich weiss ist Mergesort der Ordnung: O(n)=[log2(n)] // ( "[]"=Gaußklammer, ist gleich trunc() )

...meine ich zumindest...
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Mergesort einmal anders.

  Alt 13. Aug 2004, 18:33
Ich glaube Mergsort hat eine Zeitkomplexität von O(n·log(n)).

greetz
mytar
Francis Obikwelu
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Mergesort einmal anders.

  Alt 13. Aug 2004, 18:38
Oh Gott, oh Gott!

Gaußklammer, Zeitkomplexität, Bahnhof, Bratkartoffeln?
Man nehme die Menge und teile so lange durch 2, bis 0 ist. Dabei mitzählen und gut. Einfach Shr 1 benutzen. In anbetracht der Sortierzeit fällt das ins gewicht wie eine Fliege im Jumbojet.
Viel interessanter ist doch, daß man anzeigen kann, wie weit er sortiert hat.

Stefan
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz