Menu
Coddy logo textTech

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

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

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

מיון הכנסה מהיר מאוד על קלטים קטנים או כמעט ממוינים: הוא רץ ב-O(n) כשהנתונים כבר ממוינים, ולכן מיונים היברידיים רבים עוברים אליו עבור תת מערכים קטנים.

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

מקרהסיבוכיותהערות
המקרה הטובO(n)כבר ממוין
המקרה הממוצעO(n²)סדר אקראי
המקרה הגרועO(n²)ממוין בסדר הפוך
זיכרוןO(1)במקום
יציבכןאיברים שווים שומרים על הסדר היחסי שלהם

צעד אחר צעד

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

דוגמה מפורטת

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

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

מתי להשתמש במיון הכנסה

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

קוד Insertion Sort

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

קוד Insertion Sort ב-Python

Python
1def insertion_sort(a):2    for i in range(1, len(a)):3        key = a[i]4        j = i - 15        # Shift larger elements one slot to the right6        while j >= 0 and a[j] > key:7            a[j + 1] = a[j]8            j -= 19        a[j + 1] = key10    return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)
להריץ את הקוד הזה בעורך ה-Python אונליין

שאלות נפוצות על מיון הכנסה

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

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

להתחיל