מיון הכנסה

מיון הכנסה (באנגלית: Insertion sort) הוא אלגוריתם מיון השוואתי פשוט. הוא יעיל עבור מערכים קטנים ועבור מערכים שהם כבר ממויינים ברובם (למשל, אם המערך מויין בעבר, ולאחר מכן הוסיפו לו מספר מועט של איברים, מבלי לדאוג שהם ימוקמו במקום הנכון).
זמן הריצה הממוצע של האלגוריתם הוא פעולות (בדומה למיון בועות).
תיאור האלגוריתם
בכל איטרציה (מעבר על האוסף) נלקח איבר מאוסף הקלט, ומוכנס למקומו הנכון מתוך המערך שכבר מוין מצידו של איבר זה. בשלב הראשון נעשה מיון בין האיבר השני לאיבר הראשון כך שלאחר שלב זה כולל האזור הממוין במערך את שני האיברים הראשונים, לאחר מכן ממוקם האיבר השלישי במקומו המדוייק ביחס לשני האברים שקדמו לו, כך שהאוסף הממוין כולל את שלושת האיברים הראשונים וכן הלאה. כך עד לסיומו של מערך הקלט. המיון נעשה במקום, כלומר ללא צורך בזיכרון נוסף, פרט למערך עצמו ולתא עזר בודד.
דוגמה לקוד דמה עבור מערך המתחיל באינדקס 0 (כמו בשפת C):
for j ←1 to length(A)-1
key ← A[ j ]
> A[ j ] is added in the sorted sequence A[0, .. j-1]
i ← j - 1
while i >= 0 and A [ i ] > key
A[ i + 1 ] ← A[ i ]
i ← i - 1
A [i + 1] ← key
דוגמה למימוש עבור מערך מכל סוג נתונים שהוא (בשפת C):
void insert_sort (void *arr, size_t num, size_t size, int (*cmp) (const void *, const void *))
{
void *key;
size_t j;
int i;
key = malloc (size);
for (j = 1 ; j < num ; j++)
{
memcpy (key, (void *) ((char *) arr + size * j), size);
i = j - 1;
while (i >= 0 && cmp ((char *) arr + size * i, key))
{
memcpy ((char *) arr + size * (i + 1), (char *) arr + size * i, size);
memcpy ((char *) arr + size * i, key, size);
i--;
}
}
free (key);
}
חישוב סיבוכיות
שגיאות פרמטריות בתבנית:להשלים
'נושא2: מתמטיקה' אינו ערך חוקי
המקרה הטוב ביותר הוא כאשר הקלט הוא מספר ממיון של אברים, כך שבכל איטרציה מעבר לפעולת השמירה של האיבר הנוכחי במשתנה העזר, נעשית רק פעולת השוואה אחת לאיבר הצמוד אליו מהאוסף שכבר מוין, זמן הריצה כולל מעבר על כל איברי האוסף כשלכל מעבר עוד שני פעולות כך שסך הכל יש כאן פעולות שזה בחישוב סיבוכיות .
המקרה הגרוע הוא כאשר כל האברים ממויינים בסדר הפוך כך שהמיון כולל מעבר על כל אברי האוסף, ובכל איטרציה מספר של i בדיקות לאורך כל המערך הממויין כך שמספר הפעולות שווה ל השווה ל- פעולות ולכן סיבוכיות זמן ריצה במקרה זה הוא
המקרה הממוצע הוא כאשר המערך אינו ממויין וכולל השואות נוספות מעבר ל איטרציות, כמובן שגם מקרה זה חסום ב . אולם למרות סיבוכיות זמן הריצה לאוספים ממויינים ברובן (כגון אוסף ממויין שהוכנס לו איבר בודד שאינו ממויין) או לאוספים קטנים מאד מיון הכנסה יעיל יותר אפילו ממיונים מהירים כמו מיון מהיר, לעיתים ניתן לממש את המיון מהיר כך שאוספים קטנים עד סף מסויים (לרוב עד עשר) המיון יהיה לפי מיון הכנסה.
קישורים חיצוניים
שגיאות פרמטריות בתבנית:ויקישיתוף בשורה
פרמטרי חובה [ שם ] חסרים
- מיון הכנסה בQueue
אלגוריתמי מיון | ||
---|---|---|
רקע תאורטי | תורת הסיבוכיות • סימון אסימפטוטי • סדר מלא • רשימה • אלגוריתם תוך-מקומי • מיון יציב | |
אלגוריתמי מיון | אקראי • בועות • בחירה • בסיס • הכנסה • מהיר • מיזוג • מנייה • מסרק • סלים • ערימה • רשת מיון • שייקר • של | |
שונות | מיון טופולוגי • בעיית סידור הפנקייקים של גודמן |