====== Shakersort ======= ===== Grundlegendes ===== Ein Array mit einer gewissen Anzahl von Werten ist zu sortieren. Der **Shakersort** erledigt dies so:\\ Er durchläuft das zu sortierende Feld //abwechselnd// von //vorne nach hinten//. Dabei tauscht er, wenn er von vorne durchläuft, die Zahlen aus, wenn die erste größer ist als die zweite Zahl, dasselbe passiert analog in der anderen Richtung.\\ Wie zu erkennen ist, beschreibt der Shakersort eine gewisse Ähnlichkeit mit dem //Bubblesort//, er ist nämlich eine **Erweiterung** dessen.\\ //Andere Namen// für den Shakersort sind:\\ * Cocktailsort * Ripplesort * Shearsort * BiDiBubbleSort (bi-directional Bubblesort) ===== Code und Visualisierung ===== Hier sind Pseudocode, ein C++ Code und die Visualisierung dargestellt. ==== Pseudocode: ==== prozedur shakerSort( A : Liste sortierbarer Elemente ) beginn := -1 ende := Länge( A ) - 2 wiederhole vertauscht := falsch beginn := beginn + 1 für jedes i von beginn bis inklusive ende wiederhole falls A[ i ] > A[ i + 1 ] dann vertausche( A[ i ], A[ i + 1 ] ) vertauscht := wahr ende falls ende für falls vertauscht = falsch dann brich wiederhole-solange-Schleife ab ende falls vertauscht := falsch ende := ende - 1 für jedes i von ende bis inklusive beginn wiederhole falls A[ i ] > A[ i + 1 ] dann vertausche( A[ i ], A[ i + 1 ] ) vertauscht := wahr ende falls ende für solange vertauscht prozedur ende ==== Code für C++: ==== #include #include #include using namespace std; int main() { int z[6], hilfe; //Array für Zahlen und Variable für die Hilfsvariable. int beginn=-1, ende=4; //Beginn- und Endvariable bool bewegt=false; //Boolean, ob bewegt oder nicht cout<<"Unsortierte Zahlen:\n"; for(int i=0;i<6;i++) { z[i]=rand()%100; if(z[i]<99) z[i]=z[i]++; if(z[i]==z[i-1]) i--; //Wenn gleiche Zahl, nocheinmal berechnen cout<z[j+1]) { hilfe=z[j]; z[j]=z[j+1]; z[j+1]=hilfe; hilfe=0; //Test für Zahlenausgabe nach jedem Schritt for(int h=0;h<6;h++) { cout<=beginn;k--) //for-Schleife - von ende bis beginn, wenn getauscht werden muss, wird getauscht { if(z[k]>z[k+1]) { hilfe=z[k]; z[k]=z[k+1]; z[k+1]=hilfe; hilfe=0; //Test für Zahlenausgabe nach jedem Schritt for(int a=0;a<6;a++) { cout< ==== Visualisierung: ==== [[http://www.hermann-gruber.com/lehre/sorting/Shaker/Shaker.html|Visualisierung via Java-Applet]] ===== Quellen ===== [[http://de.wikipedia.org/wiki/Shakersort|Wikipedia (Pseudocode und alle Namen)]]\\ [[http://www.sortieralgorithmen.de/shakersort/index.html|Sortieralgorithmen.de (Information)]]\\ [[http://www.hermann-gruber.com/lehre/sorting/Shaker/Shaker.html|Visualisierungsquelle]]