Moeki Geschrieben 21. Juni 2005 Geschrieben 21. Juni 2005 In einem Array der Größe n seien nur die Werte rot, blau, grün gespeichert. Das Array soll so sortiert werden, daß zunächst alle roten, dann alle grünen und zuletzt alle blauen Farben vorkommen. Die einzigen erlaubten Zugriffsoperationen auf das Array sind test(i): Liefert die Farbe der i-ten Komponente tausch(i,j): tauscht die Inhalte der beiden Komponenten i und j Schreiben Sie einen Algorithmus, der das Array in situ in O(n) Zeit sortiert. Zeigen Sie, daß Ihr Algorithmus in O(n) Schritten (also linear) terminiert und daß das Array dann tatsächlich sortiert ist. Dieses Problem müsste man doch eigentlich rekursiv lösen oder? Quasi indem ich das Feld durchlaufe, solange die Bedingung rot < grün < blau erfüllt ist und andernfalls zwei Elemente tausche. Muss ich nun erst die ganze Liste einmal durchgehen, dabei alle relevanten Paare tauschen und danach die Liste von vorne beginnen oder welche Vorgehensweise empfiehlt ihr mir? Danke, Moeki. Zitieren
Muadibb Geschrieben 21. Juni 2005 Geschrieben 21. Juni 2005 Klingt für mich stark nach Bubble Sort Ich denke, das beantwortet alles, ausser den mathematischen Nachweis zur Komplexität Zitieren
perdian Geschrieben 21. Juni 2005 Geschrieben 21. Juni 2005 Dieses Problem müsste man doch eigentlich rekursiv lösen oder?Warum müsste? Rekursiv oder iterativ - beides ist möglich, in der Aufgabenstellung steht nix. Allgemein dürfte dir das hier weiterhelfen: http://www.sortieralgorithmen.de/ Zitieren
Moeki Geschrieben 21. Juni 2005 Autor Geschrieben 21. Juni 2005 Bubble Sort ist iterativ und die Laufzeit n^2. n^2 ist doch nicht linear oder? Zitieren
perdian Geschrieben 21. Juni 2005 Geschrieben 21. Juni 2005 Bubble Sort ist iterativ und die Laufzeit n^2. n^2 ist doch nicht linear oder?Nein, ist es nicht - die Frage hast du dir doch schon selbst beantwortet, oder? n != n^2 Zitieren
Muadibb Geschrieben 21. Juni 2005 Geschrieben 21. Juni 2005 Mal eine bescheidende Frage: Gibt es überhaupt einen Sortieralgorhitmus, der O(n) hat? Oder liegt das nur an der Aufgabenstellung, dass man bei 3 verschiedenen Elementen O(n) erreichen kann? Zitieren
perdian Geschrieben 21. Juni 2005 Geschrieben 21. Juni 2005 Gibt es überhaupt einen Sortieralgorhitmus, der O(n) hat?Das kommt immer auf die Datenstruktur an. Wenn ich ziemlich genau weiss, welche Daten ich zum Sortieren bekomme, und in welcher Art und Weise diese sortiert werden müssen, in welcher Art vielleicht schon eine Vorsortierung stattgefunden hat, und letzen Endes alles ideal abläuft, dann ist jede Laufzeit denkbar. Theoretisch sogar O(1). Ein allgemeiner Sortieralgorithmus wird allerdings niemals schneller als O(n·log(n)) sein können. Siehe auch: http://de.wikipedia.org/wiki/Sortierverfahren Zitieren
piomode1 Geschrieben 17. August 2005 Geschrieben 17. August 2005 Hi, perdi! n != n^2 Und dann kommt da so ein Klug******er und muß seinen Senf dazu abgeben: n <> n^2, für alle n <> 0 und n <> 1 Zitieren
Klotzkopp Geschrieben 17. August 2005 Geschrieben 17. August 2005 n <> n^2, für alle n <> 0 und n <> 1n ist hier keine Variable in einem algebraischen Ausdruck, sondern gehört zur Beschreibung einer Komplexitätsklasse. n steht hier nicht für einen Wert, den man einsetzen könnte. Zitieren
Bubble Geschrieben 17. August 2005 Geschrieben 17. August 2005 Mal eine bescheidende Frage: Gibt es überhaupt einen Sortieralgorhitmus, der O(n) hat? Nein. Der "beste" hat O(n*log(n)). Zitieren
Bubble Geschrieben 17. August 2005 Geschrieben 17. August 2005 Sind die Farben anfangs komplett durcheinander im Array, also "grbgrbbgbb", oder in der Form "rrbbbbbggg", die nach "rrgggbbbbb" umgewandelt werden soll? Letzteres kann in linearer Zeit umgearbeitet werden, die Sortierung einer beliebigen Anordnung nicht. Zitieren
Klotzkopp Geschrieben 17. August 2005 Geschrieben 17. August 2005 int i, j = 0; for(i=0; i<size; ++i) { if(test(i) == rot) { tausche(i, j); ++j; } } for(i=j; i<size; ++i) { if(test(i) == gruen) { tausche(i, j); ++j; } }[/code]Sollte eigentlich linear sein... Zitieren
themaster Geschrieben 24. August 2005 Geschrieben 24. August 2005 Ja, der Algorithmus ist linear. Mal zur Klärung: Der beste mögliche Sortieralgorithmus (! der nur auf Vergleichsoperationen basiert) hat eine Laufzeit von O(n log(n)). Bei diesem Sortieralgorithmus wurde allerdings die Einschränkung gemacht, dass nur drei verschiedene Werte möglich sind. Damit braucht man nicht mehr mit Vergleichsoperationen arbeiten, sondern mit dem Tauschen (ohne Vergleichen), daher ist der Algo mit O(n) möglich. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.