Danke für diese kurze und doch ausführliche Erklärung! Genau so etwas habe ich gesucht! :) Wenn ich mich mit einem solchen Verfahren beschäftige, finde ich es immer deutlich einfacher, sich zuerst eine allgemeine Erklärung anzuschauen und sich anschließend selber an dem Algorithmus zu versuchen, anstatt sich direkt einen fremden Algorithmus anzuschauen. Letzterer ist für mich nämlich aufgrund seiner Abstraktheit in der Regel deutlich schwerer zu merken.
"rückwärts hochreichen - also was vor in richtung kleiner weitergereicht wurde kommt nach links vom element auf der nächst höheren ebene, andere seite analog" ist vielleicht gut das ich nicht solche videos mache ^^ aber das ist im prinzip der satz der fehlte
im wesentlichen eh eine triviale Sache, man muss es halt mal selbst üben um es in Erinnerung zu behalten. die Erklärung ist super, doch ist es da oft so dass man es beim zuhören versteht aber noch nciht anwenden kann.
Die große Mehrheit hat sich ja darauf geeinigt, immer das letzte Element für Pivot zu nehmen. Wenn das Array zufällig gemischt ist, dann spielt es natürlich keine Rolle, welches Element man nimmt, weil es ja so oder so nur vom Zufall abhängig ist, ob dieses Element als Pivot für die aktuelle Teilung das Beste oder Schlechteste Element war. DOCH VORSICHT!!!! Wenn man es RICHTIG macht, dann MUSS man grundsätzlich IMMER das mittlere Element als Pivot verwenden. Es gibt nämlich zwei Fälle, in denen es ansonsten zum Absturz von Quicksort kommen kann, weil der Puffer-Cache bei mehr als 2748 Rekursionen überläuft. Das ist bei der Verwendung des ersten und letzten Elements für Pivot der Fall, wenn der Best- oder Worst-Case vorliegen, weil hier dann die Anzahl der gleichzeitig aktiven Rekursionen, mit der Anzahl der zu sortierenden Elemente identisch ist. Nimmt man anstelle dessen immer das mittlere Element für Pivot, dann sind selbst bei einer Million zu sortierenden Elementen, niemals mehr als 20 Rekursionen gleichzeitig aktiv.
Ich konnte die Erklaerung des Algorithmus gut in eine Java Implementation umsetzen. Verwendet habe ich TDD und war erst ueberrascht, warum die Implementation ueberhaupt funktioniert hat :)
***** Ich setze die Zahlen gleich "richtig", also mit etwas Abstand, da mir das viel Schreibarbeit erspart. Denn dauernd etwas wegzuradieren ist nicht gerade schön anzusehen. Das ändert aber nichts an der Sortierweise und macht den Algorithmus auch nicht unlogisch ;)
Wenn es keine weiteren Angaben gibt, kann man dann auch das Pivot-Element frei wählen ? Bsp: 1 5 7 9 Pivot-Element: 6 oder würde ich die 6, dann Trennwert heißen? So hatten wir es nämlich im Unterricht und das hat mich jetzt verwirrt
"Trennwert" klingt für mich einfach nach einer anderen Bezeichnung für das Pivotelement :) Wenn die Aufgabe keine Angabe zur Wahl des Trennelememts gibt, würde ich mich in deinem Fall an die Variante aus eurem Unterricht halten 👍
Wenn man jetzt als Pivot-Element das letzte Element nimmt, würde man dann auch die liste immer von links nach rechts durchgehen und die zahlen vor oder hinter das pivot element sortieren oder würde man hinten anfangen? LG
Die Richtung ist für die Laufzeit egal, du könntest beides machen. Wenn du dich für eine genauere Umsetzung interessierst, schau dir vllt mal mein zweites Video zu Quicksort an :) ruclips.net/video/htRWn-NMZnc/видео.html
Diese Art der Erklärung findet man leider zu oft auf YT. Wenn es näher an der Programmierpraxis seien soll, dann müsste man zuerst erläutern, wie man sein erstes Pivot wählt, z.B. per MedianOfThree (machen viele nicht, hast du aber erwähnt) Ansonsten müsste man eben noch zwei Pointer einführen, d.h. einen linken Pointer der auf der Zahl steht, die z.B. echt größer als das Pivot ist und eben von rechts ein Pointer, der auf ein Element zeigt, das echt kleiner ist. Und dann vergleiche ich eben und tausche bei Bedarf bzw. wenn sich die Pointer kreuzen, also ein Überlauf stattfindet, dann swappe ich betreffendes Element mit dem Pivot und dann habe ich erst eine sortierte Teilliste nach dem Divide&Conquer-Prinzip.
Es wäre schön, wenn man alle einzelnen Schritte erklärt bekommt, wie es bspw. dazu kommt, wie man die größte Zahl in einer Teilliste erhält bzw. rausfindet. DIe eigentlich wichtigen Schritte werden meiner Meinung nach übersprungen, was ich sehr schade finde!
Hi, "wie man die größte Zahl in einer Teilliste erhält" - meist du damit, wie das Pivotelement gewählt wird? Oder meinst du wie die Sortierung der Teillisten zustande kommt? Beides ist sehr abhängig von der Implementierung und auch von der Programmiersprache. Da meine Erklärungen möglichst sprachenunanhängig sein sollen, gehe ich auf die Teillistenspaltung nicht genauer ein.
Ich wollte mit meiner Frage auf die Sortierung der Teillisten hinausgehen, wie ich quasi ermitteln kann. Also angefangen mit der Wahl des Pivot-Elements und dann die einzelnen Schritte wie ich die Elemente nach der Größe ordne.
Im Video erkläre ich nur das allgemeine Prinzip. Die Handhabung des Pivotelements ("Pivot" aus dem Französischen, steht für Angelpunkt/Ankerpunkt) hängt sehr von der Implementierung ab. Darum habe ich später ein Video nachgeschoben, das den Vorgang mit Pointern betrachtet.
Ich würde vorschlagen das mal mit üblicher "in situ" Implementierung zu machen. Denn dann kommen in den Zwischenschritten ganz andere Teilfolgen raus als bei diesem "Zahlen lustig per Hand untereinanderschreiben Verfahren", das die - in der Praxis sehr wichtige - effiziente Implementierung völlig vernachlässigt. Die Grundidee von Quicksort vermittelt das Video zwar, aber das ist eben nicht alles...
+Xeridar Mehr soll das Video auch nicht vermitteln. Das Video ist unabhängig von einer Implementierung, die in unterschiedlichen Sprachen sehr unterschiedlich aussieht und ablaufen kann. Wer eine effiziente Lösung für die Programmiersprache seiner Wahl möchte, sollte auch explizit danach suchen ;)
+Bleeptrack Das Konzept, wie sich Quicksort "in situ" implementieren lässt, ist auch unabhängig von einer konkreten Programmiersprache - diese gibt nur die Syntax vor. Leider verschweigt das Video, dass es da überhaupt noch etwas zu beachten gibt - daher mein Hinweis als Kommentar.
Xeridar Ja, ich verstehe deinen Einwand. Ich habe nur auch beispielsweise funktionelle Sprachen wie Haskell im Hinterkopf, die an meiner Uni auch jeder mal zu Gesicht bekommt. Die setzen ja überhaupt nicht auf die sonst recht gängige "Pointer von rechts und links"-Methode. Deswegen versuche ich das so allgemein wie möglich zu halten.
+Xeridar Wenn ich jetzt allerdings länger darüber nachdenke... Ein Programmieranfänger der nach so einem Video sucht, wird eher nicht gerade mit einer funktionalen Sprache wie Haskell anfangen. Da sollte ich vllt. doch mal ein Video mit der in-place Variante machen.
+Bleeptrack Haskell, Prolog und Co würde ich auch außen vor lassen. Ich fand den Hinweis aber sinnvoll, da sich einige Studenten bei uns aktuell hier auf dieses Video berufen und ich ihnen jetzt erklären muss, warum der hier präsentierte "Lösungsweg" bei uns NICHT volle Punkte bringt - es fehlt eben etwas Wichtiges...
du erklärst leider nicht wieso die sortierten zahlen (rot) in genau in diesen positionen gesetzt werden... z.B die 1 und die 9 setzt du ganz links und rechts... und dann die 4 und 6 zufällig auf den richtigen positionen... wenn du eine 3 bekommen hättest, hättest du sie ja auch in die mitte gelegt und nicht da wo die 4 steht... daher macht deine sortierung keinen sinn finde ich...
Ist zwar sehr Alt die Frage, aber es wird insertet. Ist es kleiner als das Pivotelement links insertet und größer als das rechts. Man kann es auch inplace machen (habe ich selbst schon so programmiert), aber wie so oft ist dass dann eine Frage der Implementierung. Da gibt es viele verschiedene Möglichkeiten und das gehört nicht mehr zum "Pseudocode" bzw. der eigentlichen Idee dahinter.
Das ist doch nur so veranschaulicht, um Platz zu sparen. Man hätte doch noch immer links oder rechts neben der Zahl etwas hinschreiben können. Bisschen Logik und dann erübrigt sich so eine Frage
ACHTUNG: die Erklärung aus dem Video ist gut für die Theorie, in Klausuren und Prüfungen wollen die Prüfer aber auf Papier die genaue Vorgehensweise des "Computers" beim Quicksort Alg. sehen. Das heißt die "Lösung" aus dem Video wäre in einer Prüfung leider Falsch. da so der Computer nicht vorgeht.
Das würde ich so nicht verallgemeinern ;) Es kommt einfach stark darauf an wie viele Schritte abgebildet werden sollen und wie das Pivotelement gewählt werden soll.
Es geht nicht um einen C Code. Es war in einer Prüfung die Frage nach dem Quick Sort, gegeben war eine Zahlenreihe und man musste die Zahlenreihe wie bei einem Quick Sort Sortieren (kein Code sondern genau wie bei dem Video) nun die Lösung aus dem Video war hier Falsch, die Begründung des Prüfers: "Der Computer geht nicht so vor, du hast so Schritte übersprungen" d.h. man sollte den Quick Sort Schritt für Schritt anwenden wie es der Computer tun Würde.
Nach knapp 10 Jahren immer noch die beste RUclipsrin die Suchalgorithmen erklärt. DANKEEEEE
Vielen Dank für das Video! Du hast es echt gut erklärt! Die letzte halbe Minute ist aber trotzdem das Highlight! Gesundheit!
Danke für diese kurze und doch ausführliche Erklärung! Genau so etwas habe ich gesucht! :) Wenn ich mich mit einem solchen Verfahren beschäftige, finde ich es immer deutlich einfacher, sich zuerst eine allgemeine Erklärung anzuschauen und sich anschließend selber an dem Algorithmus zu versuchen, anstatt sich direkt einen fremden Algorithmus anzuschauen. Letzterer ist für mich nämlich aufgrund seiner Abstraktheit in der Regel deutlich schwerer zu merken.
Nach so vielen Videos dank deinem endlich kapiert :D Danke!
Habe mich zunächst damit schwer getan bei Quicksort, aber auch dieses Mal hast du mir wieder großartig geholfen!
#Ehrenfrau
Yeah ich hab's auch verstanden :D
Danke! Mit dieser Visualisierung hab ichs einfach hingekriegt das ganze selber zu basteln.
Gut erklärt. Nebenbei: Du hast eine schöne angenehmen Stimme!
Vielen Dank. Die Erklärungen mit "Pivot verschieben" hatte ich nicht ganz verstanden aber das Video ist sehr gut verständlich.
gutes ende! :D ne danke, hat mir grade sehr geholfen, dein video :)
Ich bedanke mich herzlichst für dieses gute Video! Einen Interessanten Channel hast du da, ich werde wohl mal öfter vorbeischauen ^^
LEGENDE!!!!!!!!!!
das ende^^ ansonsten wirklich gut erklärt :)
"rückwärts hochreichen - also was vor in richtung kleiner weitergereicht wurde kommt nach links vom element auf der nächst höheren ebene, andere seite analog"
ist vielleicht gut das ich nicht solche videos mache ^^
aber das ist im prinzip der satz der fehlte
Danke, ist für den Einstieg eine super Erklärung. Jetzt lässt sich auch der Quellcode besser verstehen :)
hat mir weiter geholfen danke
Sehr gute Erklärung in Verbindung mit dem selbstgemalten Schaubild.
habe das Verfahren in 1:47 Min. verstanden :-D heißt: gutes Video. Danke!
im wesentlichen eh eine triviale Sache, man muss es halt mal selbst üben um es in Erinnerung zu behalten.
die Erklärung ist super, doch ist es da oft so dass man es beim zuhören versteht aber noch nciht anwenden kann.
sehr gut erklärt:)tausend Dank
sehr gute un einfache erklärung! danke! :)
Sehr gut erklärt. Vielen Dank!
Die große Mehrheit hat sich ja darauf geeinigt, immer das letzte Element für Pivot zu nehmen. Wenn das Array zufällig gemischt ist, dann spielt es natürlich keine Rolle, welches Element man nimmt, weil es ja so oder so nur vom Zufall abhängig ist, ob dieses Element als Pivot für die aktuelle Teilung das Beste oder Schlechteste Element war. DOCH VORSICHT!!!! Wenn man es RICHTIG macht, dann MUSS man grundsätzlich IMMER das mittlere Element als Pivot verwenden. Es gibt nämlich zwei Fälle, in denen es ansonsten zum Absturz von Quicksort kommen kann, weil der Puffer-Cache bei mehr als 2748 Rekursionen überläuft. Das ist bei der Verwendung des ersten und letzten Elements für Pivot der Fall, wenn der Best- oder Worst-Case vorliegen, weil hier dann die Anzahl der gleichzeitig aktiven Rekursionen, mit der Anzahl der zu sortierenden Elemente identisch ist. Nimmt man anstelle dessen immer das mittlere Element für Pivot, dann sind selbst bei einer Million zu sortierenden Elementen, niemals mehr als 20 Rekursionen gleichzeitig aktiv.
Ich konnte die Erklaerung des Algorithmus gut in eine Java Implementation umsetzen. Verwendet habe ich TDD und war erst ueberrascht, warum die Implementation ueberhaupt funktioniert hat :)
Ohne Spass das Ende war so witzig D:
Morgen Programmieren und dann ein auf 9xKlug machen und das erklären. Mal sehen ob ichs hinbekomme ^ ^
Sehr sympatische Stimme :)
Mega gut Erklärt. Danke. 👌
***** Ich setze die Zahlen gleich "richtig", also mit etwas Abstand, da mir das viel Schreibarbeit erspart. Denn dauernd etwas wegzuradieren ist nicht gerade schön anzusehen. Das ändert aber nichts an der Sortierweise und macht den Algorithmus auch nicht unlogisch ;)
Wenn es keine weiteren Angaben gibt, kann man dann auch das Pivot-Element frei wählen ?
Bsp: 1 5 7 9 Pivot-Element: 6
oder würde ich die 6, dann Trennwert heißen? So hatten wir es nämlich im Unterricht und das hat mich jetzt verwirrt
"Trennwert" klingt für mich einfach nach einer anderen Bezeichnung für das Pivotelement :) Wenn die Aufgabe keine Angabe zur Wahl des Trennelememts gibt, würde ich mich in deinem Fall an die Variante aus eurem Unterricht halten 👍
Gut erklärt! :-)
Der Hammer
Wenn man jetzt als Pivot-Element das letzte Element nimmt, würde man dann auch die liste immer von links nach rechts durchgehen und die zahlen vor oder hinter das pivot element sortieren oder würde man hinten anfangen? LG
Die Richtung ist für die Laufzeit egal, du könntest beides machen. Wenn du dich für eine genauere Umsetzung interessierst, schau dir vllt mal mein zweites Video zu Quicksort an :) ruclips.net/video/htRWn-NMZnc/видео.html
@@bleeptrack Cool danke für die schnelle Antwort. Ja wir haben in der Uni das zweite Verfahren kennengelernt aber finde das erste entspannter :D
hallo, mir kommt die wahl wo man das nächste pivo element hinschreibt willkürrlich vor und schon "quasi sortiert" ?
ruclips.net/video/htRWn-NMZnc/видео.html
Das Video ist 1a. Weiter so!!!
Danke, super erklärt!! :)
万元户 更。 thank you🙏🏼
perfekt
Welche Datenstruktur wird für den Quicksort verwendet?
Ein Binärbaum? oder gleich ein Array? :)
Array oder eine Liste :)
gut erklärt :) Danke !!
Diese Art der Erklärung findet man leider zu oft auf YT. Wenn es näher an der Programmierpraxis seien soll, dann müsste man zuerst erläutern, wie man sein erstes Pivot wählt, z.B. per MedianOfThree (machen viele nicht, hast du aber erwähnt) Ansonsten müsste man eben noch zwei Pointer einführen, d.h. einen linken Pointer der auf der Zahl steht, die z.B. echt größer als das Pivot ist und eben von rechts ein Pointer, der auf ein Element zeigt, das echt kleiner ist.
Und dann vergleiche ich eben und tausche bei Bedarf bzw. wenn sich die Pointer kreuzen, also ein Überlauf stattfindet, dann swappe ich betreffendes Element mit dem Pivot und dann habe ich erst eine sortierte Teilliste nach dem Divide&Conquer-Prinzip.
Es wäre schön, wenn man alle einzelnen Schritte erklärt bekommt, wie es bspw. dazu kommt, wie man die größte Zahl in einer Teilliste erhält bzw. rausfindet. DIe eigentlich wichtigen Schritte werden meiner Meinung nach übersprungen, was ich sehr schade finde!
Hi, "wie man die größte Zahl in einer Teilliste erhält" - meist du damit, wie das Pivotelement gewählt wird? Oder meinst du wie die Sortierung der Teillisten zustande kommt?
Beides ist sehr abhängig von der Implementierung und auch von der Programmiersprache. Da meine Erklärungen möglichst sprachenunanhängig sein sollen, gehe ich auf die Teillistenspaltung nicht genauer ein.
Ich wollte mit meiner Frage auf die Sortierung der Teillisten hinausgehen, wie ich quasi ermitteln kann. Also angefangen mit der Wahl des Pivot-Elements und dann die einzelnen Schritte wie ich die Elemente nach der Größe ordne.
welche Software benutzt du, um auf dem Screen zu zeichnen?
Ich experimentiere gerne etwas. Meist zeichne ich mit Camtasia auf.
Ah, falsch gelesen. Ich benutze aktuell Krita zum Zeichnen. Bei dem Video habe ich noch Sketchbook Pro verwendet.
top, danke!! :)
Vllt wäre die Information gut gewesen was man beim Programmieren mit dem "pivo" element macht
Im Video erkläre ich nur das allgemeine Prinzip. Die Handhabung des Pivotelements ("Pivot" aus dem Französischen, steht für Angelpunkt/Ankerpunkt) hängt sehr von der Implementierung ab. Darum habe ich später ein Video nachgeschoben, das den Vorgang mit Pointern betrachtet.
@@bleeptrack Perfekt danke und auch nochmal für die Definition von Pivot
Bei diesem Vorgang arbeitet der Quicksort doch out-of-place, oder irre ich mich?
+Rex Gamer richtig :) für eine in-place Variante gibt es ein extra Video.
Ja danke :D Gutes Video und toll erklärt!
Ich würde vorschlagen das mal mit üblicher "in situ" Implementierung zu machen. Denn dann kommen in den Zwischenschritten ganz andere Teilfolgen raus als bei diesem "Zahlen lustig per Hand untereinanderschreiben Verfahren", das die - in der Praxis sehr wichtige - effiziente Implementierung völlig vernachlässigt. Die Grundidee von Quicksort vermittelt das Video zwar, aber das ist eben nicht alles...
+Xeridar Mehr soll das Video auch nicht vermitteln. Das Video ist unabhängig von einer Implementierung, die in unterschiedlichen Sprachen sehr unterschiedlich aussieht und ablaufen kann. Wer eine effiziente Lösung für die Programmiersprache seiner Wahl möchte, sollte auch explizit danach suchen ;)
+Bleeptrack Das Konzept, wie sich Quicksort "in situ" implementieren lässt, ist auch unabhängig von einer konkreten Programmiersprache - diese gibt nur die Syntax vor. Leider verschweigt das Video, dass es da überhaupt noch etwas zu beachten gibt - daher mein Hinweis als Kommentar.
Xeridar Ja, ich verstehe deinen Einwand. Ich habe nur auch beispielsweise funktionelle Sprachen wie Haskell im Hinterkopf, die an meiner Uni auch jeder mal zu Gesicht bekommt. Die setzen ja überhaupt nicht auf die sonst recht gängige "Pointer von rechts und links"-Methode. Deswegen versuche ich das so allgemein wie möglich zu halten.
+Xeridar Wenn ich jetzt allerdings länger darüber nachdenke... Ein Programmieranfänger der nach so einem Video sucht, wird eher nicht gerade mit einer funktionalen Sprache wie Haskell anfangen. Da sollte ich vllt. doch mal ein Video mit der in-place Variante machen.
+Bleeptrack Haskell, Prolog und Co würde ich auch außen vor lassen. Ich fand den Hinweis aber sinnvoll, da sich einige Studenten bei uns aktuell hier auf dieses Video berufen und ich ihnen jetzt erklären muss, warum der hier präsentierte "Lösungsweg" bei uns NICHT volle Punkte bringt - es fehlt eben etwas Wichtiges...
du erklärst leider nicht wieso die sortierten zahlen (rot) in genau in diesen positionen gesetzt werden... z.B die 1 und die 9 setzt du ganz links und rechts... und dann die 4 und 6 zufällig auf den richtigen positionen... wenn du eine 3 bekommen hättest, hättest du sie ja auch in die mitte gelegt und nicht da wo die 4 steht... daher macht deine sortierung keinen sinn finde ich...
Ist zwar sehr Alt die Frage, aber es wird insertet. Ist es kleiner als das Pivotelement links insertet und größer als das rechts. Man kann es auch inplace machen (habe ich selbst schon so programmiert), aber wie so oft ist dass dann eine Frage der Implementierung. Da gibt es viele verschiedene Möglichkeiten und das gehört nicht mehr zum "Pseudocode" bzw. der eigentlichen Idee dahinter.
Das ist doch nur so veranschaulicht, um Platz zu sparen. Man hätte doch noch immer links oder rechts neben der Zahl etwas hinschreiben können. Bisschen Logik und dann erübrigt sich so eine Frage
ACHTUNG: die Erklärung aus dem Video ist gut für die Theorie, in Klausuren und Prüfungen wollen die Prüfer aber auf Papier die genaue Vorgehensweise des "Computers" beim Quicksort Alg. sehen. Das heißt die "Lösung" aus dem Video wäre in einer Prüfung leider Falsch.
da so der Computer nicht vorgeht.
Das würde ich so nicht verallgemeinern ;) Es kommt einfach stark darauf an wie viele Schritte abgebildet werden sollen und wie das Pivotelement gewählt werden soll.
Es geht nicht um einen C Code.
Es war in einer Prüfung die Frage nach dem Quick Sort, gegeben war eine Zahlenreihe und man musste die Zahlenreihe wie bei einem Quick Sort Sortieren (kein Code sondern genau wie bei dem Video)
nun die Lösung aus dem Video war hier Falsch, die Begründung des Prüfers: "Der Computer geht nicht so vor, du hast so Schritte übersprungen"
d.h. man sollte den Quick Sort Schritt für Schritt anwenden wie es der Computer tun Würde.
Frohes Neujahr, auch wen es 6 -7 Jahre zu spät kommt.
haha I like that
Mein Tipp sag wenn du geniest hast "elhamdu lillaah".
scheiß Beispiel!!!!!!!
!!!!11elf