מיון שייקר

מיון שייקר, הידוע גם בשם מיון בועות דו כיווני, מיון קוקטייל, מיון מרטיני, שייקר סוג (אשר יכול להתייחס גם גרסה של בחירת סוג), מיון אדווה, מיון דשדוש דשדוש, או מיון הסעות, הוא וריאציה של מיון בועות שהוא גם אלגוריתם מיון יציב וגם מיון השוואתי. האלגוריתם נבדל ממיון בועות בכך שהוא ממיין לשני הכיוונים בכל מעבר על הרשימה. אלגוריתם מיון זה הוא רק מעט יותר קשה ליישום מאשר מיון בועות, ופותר את הבעיה של "צבים" בתוך מיון בועות. המיון מספק שיפור זמן ריצה שולי בלבד, והסיבוכיות שלו זהה לזו של מיון בועות; כמו מיון בועות, המיון אינו בשימוש מעשי (מיון הכנסה מועדף במיונים פשוטים), אך יש לו שימושים בלימוד. הצורה הכי פשוטה עוברת על כל הרשימה בכל פעם:  procedure cocktailShakerSort( A : list of sortable items ) defined as: do swapped := false for each i in 0 to length( A ) - 2 do: if A[ i ] > A[ i + 1 ] then // test whether the two elements are in the wrong order swap( A[ i ], A[ i + 1 ] ) // let the two elements change places swapped := true end if end for if not swapped then // we can exit the outer loop here if no swaps occurred. break do-while loop end if swapped := false for each i in length( A ) - 2 to 0 do: if A[ i ] > A[ i + 1 ] then swap( A[ i ], A[ i + 1 ] ) swapped := true end if end for while swapped // if no elements have been swapped, then the list is sorted end procedure המעבר הראשון ימינה יעביר את האיבר הגדול ביותר למקומו בסוף הרשימה, והמעבר אחריו שמאלה יעביר את האיבר הקטן ביותר למקומו בתחילת הרשימה. המעבר המלא הנוסף יעביר את האיבר השני הכי גדול והאיבר השני הכי קטן למקומם, וכן הלאה. אחרי i מעברים, האיבר ה-i מההתחלה והאיבר ה-i מהסוף יהיו במקומם, ולא צריכים שיבדקו אותם. על ידי קיצוץ החלק ברשימה שכבר מוין, מספר הפעולות יכול לקטון בחצי (עיין בערך מיון בועות). מיון שייקר הוא וריאציה קלה של מיון בועות. הוא שונה בכך שבמקום לעבור על הרשימה מלמטה למעלה, הוא עובר לחלופין מלמטה למעלה ומלמעלה למטה. הוא יכול להשיג ביצועים מעט יותר טובים ממיון בועות רגיל. הסיבה לכך היא שמיון בועות עובר על הרשימה רק בכיוון אחד ולכן יכול להעביר איברים אחורה רק צעד אחד בכל פעם. דוגמה לרשימה שמראה את הנקודה הזו היא הרשימה {2,3,4,5,1}, שתצטרך רק מעבר אחד של מיון שייקר, אבל במיון בועות רגיל תזדקק לארבעה מעברים. אולם מעבר אחד של מיון שייקר צריך להיספר כשני מעברים של מיון בועות. בדרך כלל מיון שייקר הוא פחות מפי שניים יותר מהיר ממיון בועות. אופטימיזציה נוספת יכולה להיות בכך שהאלגוריתם יזכור איפה הייתה ההחלפה האחרונה. במעבר הבא, לא יהיו החלפות מעבר לנקודה זו והמעבר יהיה קצר יותר. לאחר שמיון שייקר עובר לשני הכיוונים, הטווח של ההחלפות האפשריות, שהוא הטווח עליו צריך לעבור, יקטן בכל מעבר, וכך יקטין את זמן הריצה במעט. הסיבוכיות של מיון שייקר בסימון אסימפטוטי הוא O ( n 2 ) {\displaystyle O(n^{2})} במקרה הגרוע ובמקרה הממוצע, אבל הוא מתקרב ל O ( n ) {\displaystyle O(n)} אם הרשימה ברובה ממוינת לפני ביצוע המיון. לדוגמה, אם כל איבר נמצא במקום ששונה בלא יותר מ-k ‏(k ≥ 1) מהמקום בו הוא יסיים, הסיבוכיות של המיון הופכת להיות O ( k n ) {\displaystyle O(kn)} . Knuth, Donald E. (1973). "Sorting by Exchanging". Art of Computer Programming. Vol. 3. Sorting and Searching (1st ed.). Addison-Wesley. pp. 110–111. ISBN 0-201-03803-X. Black, Paul E.; Bockholt, Bob (24 באוגוסט 2009). "bidirectional bubble sort". In Black, Paul E. (ed.). Dictionary of Algorithms and Data Structures. National Institute of Standards and Technology. נבדק ב-5 בפברואר 2010. {{cite book}}: (עזרה) Duhl, Martin (1986). "Die schrittweise Entwicklung und Beschreibung einer Shuffle-Sort-Array Schaltung". HYPERKARL aus der Algorithmischen Darstellung des BUBBLE-SORT-ALGORITHMUS. Projektarbeit (בגרמנית). Technical University of Kaiserslautern.