AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?

Ein Thema von Der_Ventilator · begonnen am 17. Dez 2005 · letzter Beitrag vom 28. Dez 2005
Antwort Antwort
Seite 2 von 4     12 34      
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#11

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 21:13
Hi,
dachte eigentlich topologisches Sortieren besagt nur, dass nicht alle Elemente Paarweise vergleichbar sind. Also nimmt man "zufällig" ein Element und sortiert alle Elemente, die sich mit diesem Vergleichen lassen. Nun schaut man sich die Menge der unbetrachteten Elemente an und geht wieder so vor, zum Schluß erhält man also eine Sortierung, dass für jede Teilmenge von paarweise vergleichbaren Elementen sortiert ist, doch die Reihenfolge dieser Teilmengen wäre dann beliebig.
Aber klar, kenne ich auch am ehesten im Zusammenhang mit Graphen und kann es auch noch falsch in Erinnerung haben (begegnet mir eher selten als Begriff).

Was Merge- und Quicksort angeht, so sollte man wirklich nicht vergessen, dass die Asymptotische Laufzeit konstante Faktoren versteckt (sonst stellt sich schnell die Frage warum Quicksort und nicht Bubblesort, beide O(n^{2})), aber umsonst heißt der Quicksort nicht Quicksort. Amortisiert komme ich ja auch nur auf O(n*log n), aber was wichtiger ist, wie alzmair schon sagte, ich muss immer die ganze Menge im Speicher halten.

Also welche Sortierung die schnellste ist (immerhin auch in linearer Zeit möglich), hängt doch stark von der Menge der Daten und der Art des Speichers ab, sollte hier aber nicht das Problem sein.
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 21:21
Zitat von alzaimar:
Übrigens ist laut der grauen Theorie Mergesort im Gegensatz zu Quicksort vom Laufzeitverhalten auch im Worst-Case-Bereich optimal. Davon merkt man beim In-Memory-sortieren zwar Nichts, aber beim externen Sortieren sehr wohl: Dafür wurde Mergesort (Stichwort: Bänder) auch entwickelt.
Deswegen hab ich Mergesort vorgeschlagen. Dessen WorstCase-Verhalten enstpricht dem AverageCase von QuickSort (O(n*logn))

Zitat von alzaimar:
Das macht "Topologisches Sortieren"? Ich dachte immer, das sortiert nur einen Graphen. Welches Sortierverfahren behält 'die Reihenfolge früherer Sortierkriterien' nach erneutem 'Sortieren nach einem anderen Kriterium' bei? Ich kenne Datenstrukturen, die das machen, aber keine Sortierverfahren. Ach, auch egal. Wir wissen ja, was gemeint ist.
Keine Ahnung, ob topologisches Sortieren das macht, der Begriff sagt mir nichts
Ich gehe nur davon aus, daß eben das stabile Sortierverfahren gemeint war.
Bei stabilen Sortierverfahren ist sicher, daß bei Übereinstimmen zweier Elemente (nach dem jeweiligen Sortierkriterium) die bisherige Sortierung beibehalten wird. Das ist bei instabilen Verfahren, wie zB QuickSort nicht zwingend der Fall.

Bsp:
Code:
10-a
13-g
17-c
14-c
21-r
11-u
13-h
Wir sortieren erstmal nach den Zahlen:
Code:
10-a
11-u
13-g
13-h
14-c
17-c
21-r
Dann nach den Buchstaben
Code:
10-a
14-c
17-c
13-g // g und h sind bei 13 in der
13-h // richtigen Reihenfolge
21-r
11-u
Es ist jetzt hier gewährleistet, daß gleiche Zahlen nach dem 2. Sortieren auch immer noch jeweils richtig nach Buchstaben sortiert sind.

PS: Ich hätte vielleicht ein aussagekräftigeres und besseres Beispiel wählen können, aber ich hab keine Lust dazu gehabt Hoffe, das is trotzdem halbwegs klar geworden, sonst frag nochmal.
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#13

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 21:23
Hallo,

hier findet sich eine Funktion, die die "Natürliche Sortierung" (so heisst das Ganze) unterstützt. Funktioniert genauso wir CompareString o. ä.

Gruß
xaromz
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 22:17
@leddl: Mein Vorschlag basiert auf einer totalen Ordnung und sortiert nur ein Mal, sodass der Unterschied zwischen 'stabilen' und 'instabilen'Sortierverfahren obsolet ist. Oder anders herum: Jedes Sortierverfahren wird bei einer totalen Ordnungsfunktion immer korrekt und 'stabil' sein, weil eben die Elemente immer eine eindeutige Reihenfolge haben.

Deshalb mein Vorschlag, eine totale Ordnung auf die Titelliste über die Vergleichsfunktion abzubilden und dann ein X-beliebiges Sortierverfahren zu verwenden.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Der_Ventilator

Registriert seit: 11. Apr 2004
Ort: Kanada
136 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 21. Dez 2005, 12:33
Zitat von xaromz:
Hallo,

hier findet sich eine Funktion, die die "Natürliche Sortierung" (so heisst das Ganze) unterstützt. Funktioniert genauso wir CompareString o. ä.

Gruß
xaromz
Danke, durch deinen Hinweiß auf die "Natürliche Sortierung" habe ich nun hier
http://www.delphipraxis.net/internal...t.php?p=250797
das passende gefunden.
Danke an alle.
Codito, ergo sum. - I code therefore I am
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#16

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 21. Dez 2005, 13:00
Du könntest ja auch den String in ein Array splitten, wobei der Übergang Zahl-Sonstiges (ausser . und , ) und Sonstiges-Zahl jeweils ein neues Array eröffnet:

Aus 'Bitmap2Icon12345.exe' wird ['Bitmap','2','Icon','12345','.exe']. Das musst du dann nur noch nacheinander sortieren, wobei du, wenn es mit inttostr funktioniert, die Zahlenwerte vergleichst.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Der_Ventilator

Registriert seit: 11. Apr 2004
Ort: Kanada
136 Beiträge
 
Delphi 2010 Professional
 
#17

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 21. Dez 2005, 14:04
Was heißt nacheinander sortieren?

Sortiere ich nach der ersten Spalte, dann wird nach der ersten Spalte sortiert.
Wie kann ich denn der 2. Spalte sagen, dass sie nur innerhalb der gleichen der 1. Spalte sortieren soll?

Soll ich die 1. Spalte abgehen und dann nur die Teile, in denen die jeweilige Zeile den nachfolgenden Zeilen gleich ist, einem Sortieralgortihmus unterwerfen?

Oder gibts da einfachere Möglichkeiten?
Codito, ergo sum. - I code therefore I am
  Mit Zitat antworten Zitat
Der_Ventilator

Registriert seit: 11. Apr 2004
Ort: Kanada
136 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 25. Dez 2005, 18:28
Zitat von Der_Ventilator:
Danke, durch deinen Hinweiß auf die "Natürliche Sortierung" habe ich nun hier
http://www.delphipraxis.net/internal...t.php?p=250797
das passende gefunden.
Danke an alle.
OK, wie oben genannt wird dort folgende Funktion angeboten:

Delphi-Quellcode:
//****************************************************************************//
function NatCompareText(const S1, S2: WideString): Integer;
begin
  SetLastError(0);
  Result := CompareStringW(LOCALE_USER_DEFAULT,
                           NORM_IGNORECASE or
                           NORM_IGNORENONSPACE or
                           NORM_IGNORESYMBOLS,
                           PWideChar(S1),
                           Length(S1),
                           PWideChar(S2),
                           Length(S2)) - 2;
  case GetLastError of
    0: ;
    ERROR_CALL_NOT_IMPLEMENTED: Result := DumbItDownFor95(S1,
                                                          S2,
                                                          NORM_IGNORECASE or
                                                          NORM_IGNORENONSPACE or
                                                          NORM_IGNORESYMBOLS);
  else
    RaiseLastOSError;
  end;
end;
//****************************************************************************//
//****************************************************************************//   

//Und falls es doch Probleme gibt (wurde im PSDK extra drauf hingewiesen):

   
function DumbItDownFor95(const S1, S2: WideString; CmpFlags: Integer): Integer;
var
  a1, a2: AnsiString;
begin
  a1 := s1;
  a2 := s2;
  Result := CompareStringA(LOCALE_USER_DEFAULT, CmpFlags, PChar(a1), Length(a1),
    PChar(a2), Length(a2)) - 2;
end;

Nur leider funktioniert sie überhaupt nicht.
Sie bewertet immer noch '2' größer als '14'.
Codito, ergo sum. - I code therefore I am
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 25. Dez 2005, 18:42
Ich verweise nochmal auf meinen Beitrag auf der vorigen Seite, in dem ich genau erklärt habe, wie man das anstellen kann, so dass es garantiert funktioniert. Kein Windows kann wissen, wie deine Titel strukturiert sind, das weisst nur Du. Also musst Du die Titel auseinanderpflücken und getrennt sortieren. So schwer ist das doch nicht. Außer, die Title sind immer wieder anders sortiert, aber dann kann auch der beste Rechner Nichts ausrichten...

Und wenn Du willst, dass '2' kleiner sein soll, also '14', dann versuchs mal mit 'StrToInt' o.ä.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#20

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 25. Dez 2005, 18:44
Zitat von leddl:
as hat im übrigen auch bei großen Datenmengen ne bessere Laufzeit als dein Quicksort. Das hat nämlich im worst Case O(n²), MergeSort nur O(n*logn).
Im Worst-Case ja. Aber auch nur da, und versuch Du mal Daten zu konstruieren die beim Quicksort zum Worst Case führen.
Vor allem, wenn man einen geschickten randomisierten Quicksort verwendet erhält man nachweislich nie den Worst-Case.

Will heissen wir ziehen hier zum Vergleich sowieso immer nur den Average-Case heran und der ist beim Quicksort mit O(n*log(n)) nunmal nachweislich am Optimum. Deswegen heisst das Ding ja auch quicksort: Weil es der schnellste zur Zeit bekannte Sortieralgorithmus ist.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 00:44 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