Smart-World Surf

יחידה 9: אלגוריתמי מיון

הכרות עם אלגוריתמי מיון נפוצים, ניתוחם והשוואתם.
מיון בועותבחירההכנסהמיון מיזוג (Mergesort)מיון מהיר (Quicksort)מיון ספירה ומיון בסיס

ברוכים הבאים ליחידת הלימוד בנושא "אלגוריתמי מיון" במסגרת הקורס "מבני נתונים ומבוא לאלגוריתמים". מיון הוא אחד הבעיות היסודיות והנחקרות ביותר במדעי המחשב, והבנה מעמיקה של אלגוריתמי מיון חיונית לפיתוח תוכנה יעילה ולניתוח ביצועים. יחידה זו תציג בפניכם מגוון אלגוריתמי מיון נפוצים, תנתח את מורכבותם ותשווה ביניהם, תוך דגש על הבנה תיאורטית ומעשית הנדרשת לבחינות.

עקרונות יסוד במיון ואלגוריתמי מיון השוואתיים פשוטים

מיון הוא תהליך של סידור רשימת איברים בסדר מסוים (לרוב עולה או יורד). אלגוריתמי מיון נבדלים זה מזה במורכבות זמן הריצה, מורכבות המקום, יציבותם ויכולתם למיין "במקום".

מורכבות זמן: מדד לכמות הפעולות הנדרשות לאלגוריתם כתלות בגודל הקלט (n).
מורכבות מקום: מדד לכמות הזיכרון הנוסף הנדרש לאלגוריתם (מעבר לקלט עצמו).
יציבות (Stability): אלגוריתם מיון נחשב יציב אם הוא שומר על הסדר היחסי של איברים שווים בקלט.
מיון במקום (In-place): אלגוריתם מיון שאינו דורש כמות זיכרון נוספת משמעותית (לרוב O(1) או O(log n)).

אלגוריתמי מיון השוואתיים פשוטים (O(n^2))

אלגוריתמים אלו פועלים על ידי השוואת זוגות איברים והחלפתם במידת הצורך. הם פשוטים להבנה ויישום, אך אינם יעילים עבור קלטים גדולים.

מיון בועות (Bubble Sort)

חוזר שוב ושוב על הרשימה, משווה זוגות איברים סמוכים ומחליף אותם אם הם בסדר שגוי, עד שהרשימה ממוינת. אינו יעיל במיוחד.

  • מורכבות זמן: O(n^2) במקרה הגרוע והממוצע, O(n) במקרה הטוב (כשהרשימה כבר ממוינת).
  • מורכבות מקום: O(1) (במקום).
  • יציבות: יציב.

מיון בחירה (Selection Sort)

מוצא בכל שלב את האיבר הקטן ביותר (או הגדול ביותר) מבין האיברים שנותרו, ומחליף אותו עם האיבר במיקום הנוכחי. פשוט אך לא יעיל.

  • מורכבות זמן: O(n^2) בכל המקרים (טוב, ממוצע, גרוע).
  • מורכבות מקום: O(1) (במקום).
  • יציבות: לא יציב באופן טבעי (אך ניתן ליישם אותו כיציב).

מיון הכנסה (Insertion Sort)

בכל שלב, לוקח איבר מהקלט הלא ממוין ומכניס אותו למקומו הנכון בחלק הממוין של הרשימה. יעיל עבור רשימות קטנות או כמעט ממוינות.

  • מורכבות זמן: O(n^2) במקרה הגרוע והממוצע, O(n) במקרה הטוב (כשהרשימה כבר ממוינת).
  • מורכבות מקום: O(1) (במקום).
  • יציבות: יציב.

אלגוריתמי מיון השוואתיים מתקדמים (O(n log n))

אלגוריתמים אלו מבוססים לרוב על עקרון "הפרד ומשול" ומציעים ביצועים טובים בהרבה עבור קלטים גדולים.

הפרד ומשול (Divide and Conquer): פרדיגמת תכנון אלגוריתמים הכוללת חלוקת בעיה לתת-בעיות קטנות יותר, פתרון התת-בעיות באופן רקורסיבי, ואיחוד הפתרונות לפתרון הבעיה המקורית.

מיון מיזוג (Mergesort)

אלגוריתם "הפרד ומשול" שמחלק את הרשימה לשני חצאים, ממיין כל חצי בנפרד באופן רקורסיבי, ואז ממזג את שני החצאים הממוינים לרשימה אחת ממוינת.

  • מורכבות זמן: O(n log n) בכל המקרים (טוב, ממוצע, גרוע).
  • מורכבות מקום: O(n) (דורש מערך עזר למיזוג).
  • יציבות: יציב.

מיון מהיר (Quicksort)

אלגוריתם "הפרד ומשול" שבוחר איבר ציר (pivot), מחלק את הרשימה לשני חלקים: איברים קטנים מהציר ואיברים גדולים מהציר, וממיין כל חלק בנפרד באופן רקורסיבי.

  • מורכבות זמן: O(n log n) במקרה הממוצע והטוב, O(n^2) במקרה הגרוע.
  • מורכבות מקום: O(log n) במקרה הממוצע (עבור עומק הרקורסיה), O(n) במקרה הגרוע.
  • יציבות: לא יציב באופן טבעי.
מיון מהיר (Quicksort) – מקרה גרוע ובחירת ציר: בבחינות, שאלה נפוצה היא על המקרה הגרוע של Quicksort וכיצד ניתן להימנע ממנו. המקרה הגרוע (O(n^2)) מתרחש כאשר בחירת הציר גרועה באופן עקבי (לדוגמה, תמיד האיבר הקטן ביותר או הגדול ביותר ברשימה שאינה ממוינת). הבנת אסטרטגיות לבחירת ציר (כגון בחירת ציר אקראית, או "חציון משלושה") היא קריטית להבטחת ביצועים ממוצעים טובים.

אלגוריתמי מיון לא השוואתיים (Non-Comparison Sorts)

אלגוריתמים אלו אינם מבוססים על השוואות בין איברים, ולכן יכולים לעבור את חסם התחתון של O(n log n) עבור מיון השוואתי, ולהגיע למורכבות זמן לינארית O(n). עם זאת, הם דורשים הנחות מסוימות לגבי טווח הערכים או מבנה האיברים.

מיון ספירה (Counting Sort)

ממיין איברים שלמים בטווח קטן וספציפי. הוא סופר את מספר ההופעות של כל איבר, ואז משתמש במידע זה כדי למקם כל איבר במיקומו הסופי במערך הפלט.

  • מורכבות זמן: O(n + k), כאשר k הוא טווח הערכים.
  • מורכבות מקום: O(n + k).
  • יציבות: יציב.
  • מגבלות: מתאים רק למספרים שלמים בטווח קטן יחסית.

מיון בסיס (Radix Sort)

ממיין איברים על ידי עיבוד ספרותיהם (או ביטים) בנפרד, החל מהספרה הפחות משמעותית (LSD) או המשמעותית ביותר (MSD). הוא משתמש באלגוריתם מיון יציב (כמו Counting Sort) כתת-שגרה למיון לפי כל ספרה.

  • מורכבות זמן: O(d * (n + k)), כאשר d הוא מספר הספרות (או ביטים) ו-k הוא בסיס המספרים (לדוגמה, 10 עבור עשרוני).
  • מורכבות מקום: O(n + k).
  • יציבות: יציב (תלוי ביציבות תת-שגרת המיון).
  • מגבלות: מתאים למספרים שלמים או נתונים שניתן לייצג כספרות.

שאלות לדיון

  • השוו בין מיון מיזוג (Mergesort) למיון מהיר (Quicksort) מבחינת מורכבות זמן (מקרה ממוצע וגרוע), מורכבות מקום ויציבות. באילו תרחישים תעדיפו אלגוריתם אחד על פני השני?
  • הסבירו מדוע מיון ספירה (Counting Sort) ומיון בסיס (Radix Sort) יכולים להשיג מורכבות זמן לינארית, בעוד שלאלגוריתמי מיון השוואתיים יש חסם תחתון של O(n log n). מהן המגבלות העיקריות של אלגוריתמי מיון לא השוואתיים?
  • בצעו מעקב (trace) אחר אלגוריתם מיון הכנסה (Insertion Sort) על המערך הבא: [5, 2, 4, 6, 1, 3]. נתחו את ביצועיו של מיון הכנסה על נתונים כמעט ממוינים.

נקודות לתשובת מודל

  • השוואת Mergesort ו-Quicksort:
    • Mergesort: מורכבות זמן O(n log n) בכל המקרים (טוב, ממוצע, גרוע), מורכבות מקום O(n), יציב. עדיף כאשר יציבות או ביצועים מובטחים הם קריטיים, או כאשר הנתונים נמצאים על דיסק וגישה סדרתית עדיפה.
    • Quicksort: מורכבות זמן O(n log n) בממוצע, O(n^2) במקרה הגרוע, מורכבות מקום O(log n) בממוצע (במקום), לא יציב. עדיף כאשר ביצועים ממוצעים מהירים חשובים, וניתן לסבול חוסר יציבות או סיכון קטן למקרה גרוע (שניתן לצמצם עם בחירת ציר טובה).
  • אלגוריתמי מיון לא השוואתיים:
    • הם משיגים זמן לינארי מכיוון שהם אינם מסתמכים על השוואות בין איברים, ולכן עוקפים את חסם התחתון של עץ ההחלטות. במקום זאת, הם מנצלים תכונות של האיברים (כגון ערכם המספרי או ספרותיהם) כדי למקם אותם ישירות.
    • מגבלות: דורשים שהאיברים יהיו מספרים שלמים או ניתנים לייצוג ככאלה, דורשים ידע מוקדם על טווח הערכים (Counting Sort) או מספר הספרות (Radix Sort), ועלולים לדרוש זיכרון רב אם טווח הערכים גדול מאוד.
  • מעקב וניתוח Insertion Sort:
    • מעקב:
      1. [5, 2, 4, 6, 1, 3]
      2. [2, 5, 4, 6, 1, 3] (הכנסת 2)
      3. [2, 4, 5, 6, 1, 3] (הכנסת 4)
      4. [2, 4, 5, 6, 1, 3] (הכנסת 6)
      5. [1, 2, 4, 5, 6, 3] (הכנסת 1)
      6. [1, 2, 3, 4, 5, 6] (הכנסת 3)
    • ביצועים על נתונים כמעט ממוינים: Insertion Sort מצטיין על נתונים כמעט ממוינים. במקרה זה, רק מעט איברים צריכים לזוז רחוק ממקומם, ורוב ההשוואות וההזזות יהיו מינימליות. מורכבות הזמן במקרה זה מתקרבת ל-O(n), מכיוון שכל איבר דורש רק מספר קבוע של השוואות והזזות בממוצע כדי למצוא את מקומו הנכון.
מצאתם טעות או שחסר משהו?
→ הקודמת
גרפים
הבאה ←
גישות לתכנון אלגוריתמים