מיון של – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
Yoavd (שיחה | תרומות)
תקלדה
עריכה, הורדת הערה
שורה 1:
'''shellSortShell Sort''' הוא [[אלגוריתם]] [[מיון (מדעי המחשב)|מיון]] אשר עם המימוש המקורי שלו דורש זמן ריצה של <math>\ O(n2n^2)</math> השוואות והחלפות במקרה הגרוע (בשינויים קטנים, תלוי בקלט) . האלגוריתם בא לשפר את אלגוריתם [[מיון הכנסה]] insertion(Insertion sortSort), משתישיעילותו סיבות:רבה 1.רק insertionכאשר sortהקלט שעליו יעיללמיין כבר כאשרממוין הקלטברובו כמעטואילו ממויןבמקרה הממוצע יעילותו פחותה.
{{עריכה}}
'''shellSort ''' הוא [[אלגוריתם]] [[מיון (מדעי המחשב)|מיון]] אשר עם המימוש המקורי שלו דורש זמן ריצה של O(n2) השוואות והחלפות במקרה הגרוע (בשינויים קטנים תלוי בקלט) . האלגוריתם בא לשפר את אלגוריתם insertion sort, משתי סיבות: 1. insertion sort יעיל כאשר הקלט כמעט ממוין
2. insertion sort אינו יעיל במקרה הממוצע מפני שהוא מזיז ערך בודד כל פעם.
 
==אופן פעולה==
Shell sort האלגוריתם בא לשפר את אלגוריתם insertion sort, ע"י השוואת האלמנטים המופרדים ע"י מרווחים של כמה מקומות. דבר זה מאפשר לכל אלמנט לקחת צעדים יותר גדולים לקראת מיקומו המתאים. מספר רב של מעברים על הקלט נלקחים במרווחים יותר ויותר קטנים. הצעד האחרון של ה shellSort הוא מיון פשוט אך עד אז המערך של הקלט הוא כבר כמעט ממוין.
האלגוריתם בא לשפר את אלגוריתם Insertion Sort, ומבוסס עליו. בקצרה, פעולתו של ה Insertion Sort מבוססת על מעבר על המערך, כאשר אם נמצא ערך שאינו במקומו, הוא מוזז למיקומו הנכון. כאמור, אלגוריתם זה יעיל בעיקר רק עבור מערכים שכבר ממוינים ברובם. אלגוריתם ה-Shell Sort פועל בשלבים, בהם הוא ממיין תאי מערך הרחוקים זה מזה מרחק שהולך וקטן בכל שלב, כשהמיון עצמו מתבצע בצורת מיון הכנסה. לדוגמה (דוגמה אפשרית התלויה במימוש) - במערך שגודלו 12 (בהנחה שמספרי התאים מתחילים ב-1 ונגמרים ב-12) יתחיל המיון בתאים שרחוקים 6 מקומות זה מזה. האלגוריתם ימיין רק את התאים 1 ו-7, לאחר מכן את 2 ו-8, 3 ו-9, וכן הלאה עד 5 ו-11, כאשר הוא פועל בכל פעם על שני תאים בלבד. בשלב השני יעבור האלגוריתם למיון התאים שמרחקם זה מזה הוא שלוש, ולכן ימיין את התאים 1, 4, 7, ו-10, לאחר מכן את 2, 5, 8, ו-11, ולבסוף את 3, 6, ו-9. בשלב הבא והאחרון יבצע האלגוריתם מיון הכנסה רגיל על המערך. לסיכום - מספר רב של מעברים על הקלט נלקחים במרווחים יותר ויותר קטנים, עד שלבסוף מתבצע מיון הכנסה רגיל על כל המערך, כשבשלב זה המערך כמעט ממוין לגמרי.
 
==יעילות==
נאמר שהערך הכיהקטן קטןביותר במערך שגודלו <math>N</math> נמצא במקום האחרון. בשימוש ב[[מיון bubbleבועות]] sort(Bubble Sort) או insertion[[מיון sortהכנסה]] (Insertion Sort) זה ייקח בערך n<math>N</math> השוואות והחלפות כדי להביא את אותו ערך למיקומו המתאים .
ב shellSort אנו מזיזים את הערך ראשית בצעדים ענקיים כך שערך קטן ינוע דרך ארוכה לקראת המיקום הסופי שלו באמצעות השוואות בודדות.
ב Shell Sort אנו מזיזים את הערך בצעדים גדולים (בשלבי המיון הראשוניים) כך שערך קטן ינוע דרך ארוכה לקראת המיקום הסופי שלו באמצעות השוואות בודדות. אם כך, למרות שבמיון זה מתבצעים מעברים רבים על המערך, בכל פעם המערך ממוין יותר ולכן גם יעילות מיון ההכנסה שמתבצע בכל שלב רבה יותר. כתוצאה מכך, יעילותו של מיון זה רבה יותר מזו של אלגוריתם ה-Insertion Sort.
דרך אחת לתאר זאת היא זו: ארגן את הרשימה למיון לטבלה ומיין כל עמודה בנפרד, תוך שימוש ב insertion sort . חזור על התהליך כשכל פעם עשה זאת עם מספר קטן יותר של תורים ארוכים יותר. לבסוף תקבל טבלה עם עמודה אחת. ע"י הפיכת הרשימה לטבלה, יותר פשוט לראות זאת, האלגוריתם עצמו מבצע את המיון במקום (ע"י הגדלת האינדקס בגודל הצעדים כלומר שימוש ב i+=step size במקום i++)
לדוגמא: נתונה הרשימה הבאה למיון:
[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10]
נתחיל עם מיון ב- 5 צעדים. נהפוך את הרשימה לטבלה בעלת 5 עמודות:
 
דרך אחת לתאר זאת היא זו: ארגן את הרשימה למיון לטבלה ומיין כל עמודה בנפרד, תוך שימוש ב insertion sortInsertion Sort. חזור על התהליך כשכל פעם עשה זאת עם מספר קטן יותר של תורים ארוכים יותר. לבסוף תקבל טבלה עם עמודה אחת. ע"יעל ידי הפיכת הרשימה לטבלה, יותר פשוט לראות זאת,: האלגוריתם עצמו מבצע את המיון במקום (ע"יעל ידי הגדלת האינדקס בגודל הצעדים כלומר שימוש ב i+=step size במקום i++)
 
===דוגמה===
לדוגמא: נתונה הרשימה הבאה למיון:
 
[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ]
 
נתחיל עם מיון ב- 5 צעדים. נהפוך את הרשימה לטבלה בעלת 5 עמודות:
 
<pre>
שורה 27 ⟵ 31:
45
</pre>
 
 
 
כעת כשנחזיר את הטבלה לצורת רשימה נקבל
[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].
ניתן לראות שהערך 10 זז מהסוף להתחלה. כעת נוכל למיין את הרשימה ע"י ב-3 צעדים ואח"כואחר כך על ע"יידי צעד ואז נקבל אותה ממוינת לחלוטין.
 
[[קטגוריה:אלגוריתמי מיון]]