Menu
Coddy logo textTech

Merge Sort (מיון מיזוג)

עודכן לאחרונה

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

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

סיבוכיות זמן וזיכרון

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

צעד אחר צעד

צעדמה קורה
1אם בטווח יש 0 או 1 איברים, הוא כבר ממוין.
2מפצלים את הטווח לשני חצאים.
3ממיינים ברקורסיה את החצי השמאלי במיון מיזוג.
4ממיינים ברקורסיה את החצי הימני במיון מיזוג.
5ממזגים את שני החצאים הממוינים עם שני מצביעים.

דוגמה מפורטת

מיון של [5, 2, 4, 1]:

שלבמערךפעולה
פיצול[5, 2] | [4, 1]מחלקים את המערך לשני חצאים
פיצול[5] [2] | [4] [1]מחלקים שוב עד שכל חלק הוא איבר יחיד
מיזוג[2, 5] | [1, 4]ממזגים את [5],[2] ל-[2, 5] ואת [4],[1] ל-[1, 4]
מיזוג[1, 2, 4, 5]ממזגים את [2, 5] ו-[1, 4]: בוחרים 1, אחר כך 2, אחר כך 4, ואז 5
סיום[1, 2, 4, 5]המערך ממוין לגמרי

מתי להשתמש במיון מיזוג

השתמשו בו כאשרהימנעו ממנו כאשר
אתם צריכים מקרה גרוע מובטח של O(n log n)הזיכרון מוגבל ו-O(n) זיכרון נוסף אינו מקובל
יציבות חשובה (מפתחות שווים שומרים על הסדר שלהם)אתם ממיינים מערכים קטנים שבהם מיון הכנסה מהיר יותר
אתם ממיינים רשימה מקושרתמיון במקום הוא דרישה מחייבת
הנתונים גדולים מדי לזיכרון RAM (מיון חיצוני)מקומיות המטמון קובעת, והמעברים במקום של quicksort מנצחים

קוד Merge Sort

מימוש נקי של Merge Sort שאפשר להריץ, ב-Python, JavaScript, Java, C++, C, Pseudocode. בחרו שפה, העתיקו את הקוד, או פתחו אותו טעון מראש בעורך האונליין של Coddy.

קוד Merge Sort ב-Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
להריץ את הקוד הזה בעורך ה-Python אונליין

שאלות נפוצות על מיון מיזוג

מהי סיבוכיות הזמן של מיון מיזוג?
מיון מיזוג הוא O(n log n) במקרה הטוב, הממוצע והגרוע, כי הוא תמיד מחלק את המערך לחצאים. הוא משתמש ב-O(n) זיכרון נוסף עבור חוצץ המיזוג.
האם מיון מיזוג יציב?
כן, כששלב המיזוג מכריע שוויון על ידי לקיחה מהחצי השמאלי קודם. כך איברים שווים נשארים בסדר היחסי המקורי שלהם, ולכן מיון מיזוג הוא בחירה נפוצה למיון יציב.
למה לבחור במיון מיזוג ולא ב-quicksort?
מיון מיזוג מבטיח O(n log n) גם על קלטים עוינים והוא יציב, ואילו quicksort יכול להידרדר ל-O(n²). מיון מיזוג מועדף גם עבור רשימות מקושרות ומיון חיצוני. החיסרון הוא O(n) הזיכרון הנוסף שלו.
מה ההבדל בין מיון מיזוג ל-quicksort?
שניהם מיונים מסוג הפרד ומשול, אבל quicksort מחלק סביב ציר וממיין במקום עם O(log n) זיכרון מחסנית, ואילו מיון מיזוג מפצל לחצאים בלי להסתכל על הערכים וממזג בעזרת חוצץ של O(n). בפועל quicksort בדרך כלל מהיר יותר בזכות מקומיות המטמון, אבל למיון מיזוג יש מקרה גרוע מובטח של O(n log n) והוא יציב.
מתי כדאי להשתמש במיון מיזוג בפועל?
בחרו במיון מיזוג כשאתם צריכים מיון יציב עם חסם מובטח של O(n log n), כשממיינים רשימות מקושרות (שם הוא לא צריך גישה אקראית), או כשמבצעים מיון חיצוני של נתונים גדולים מכדי להיכנס לזיכרון. הימנעו ממנו כשהזיכרון מצומצם, כי הוא צריך O(n) זיכרון נוסף.
האם מיון מיזוג ממיין במקום?
לא. מיון מיזוג סטנדרטי מקצה חוצץ זמני של O(n) כדי למזג את שני החצאים, ולכן הוא לא ממיין במקום. קיימות גרסאות מיזוג במקום, אבל הן מורכבות, ואיטיות יותר או מאבדות את היציבות, ולכן הגרסה מבוססת החוצץ היא הבחירה הנפוצה.
איור של שפות התכנות ב-Coddy

לשלוט באלגוריתמים עם Coddy

להתחיל