× מי אנחנו? התוכנית הראשונה משתנים קלט ופלט אופרטורים חשבוניים משפטי בקרה לולאות לולאות דו ממדיות casting sizeof typedef פונקציות רקורסיות מצביעים מצביע כפול מערכים מערכים דינאמיים מערכים דו ממדים מחרוזות חיפוש בינארי מיון בועות מיון בחירה מיון הכנסה מיון מהיר מיון מיזוג

Let's learn C

מיון הכנסה

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


נראה תהליך זה על ידי דוגמה על המערך הבא:


ראשית, אנו מתחילים מתא מספר אחד במערך (כלומר התא השני – כפי שזכור לנו הספירה בתכנות מתבצעת לעיתים קרובות מאוד מ0).
אנו מכניסים את הערך שבתוך התא למשתנה עזר שנקרא לו temp ולאחר מכן נתחיל לבצע השוואה בין המשתנה temp לבין כל האיברים שנמצאים משמאלו (כלומר אם עכשיו אנחנו נמצאים בתא i אז אנחנו נבצע את הבדיקות מתא i-1 עד לתא 0 כולל).
אנו נשתמש כאן ב2 אינדקסים האחד הוא i שמציין את התא הנוכחי שעליו אנו נמצאים ואינדקס j שתמיד יתחיל מהתא i-1.
כאשר אנו עושים את ההשוואה: אם האיבר בתא j גדול יותר מהערך שבתוך המשתנה temp אז, אנחנו לוקחים את הערך בתא j ומכניסים אותו לתא j+1.
לאחר מכן, אנו נמשיך בבדיקות עד שנעבור את תא מספר אפס או עד שאנחנו נגיע לתא שהערך שבתוכו קטן יותר מהערך שבתוך משתנה temp.


תהליך המיון:

משתנה העזר שלנו temp יכיל כעת את הערך שנמצא בתא מספר 1 במערך (7).

כעת אנחנו מתחילים לבצע את ההשוואה בין הערך שנמצא בtemp אל מול הערך שנמצא באינדקס 0.


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



כעת אנו עוברים לתא מספר 2 ומכניסים את הערך שלו (4) למשתנה temp ומתחילים השוואות אל מול התאים משמאלו.

משווים ראשית מול תא מספר 1 ורואים שהערך 7 גדול מהערך 4.

לכן נכניס את הערך 7 לתא מספר 2.
בשלב זה תא מספר 1 נשאר ללא שינוי והמערך שלנו יראה כך :


עכשיו אנחנו עושים השוואה בין תא מספר 0 למשתנה ה temp ואנחנו רואים שהערך 4 גדול יותר מהערך 2 ולכן אנחנו עוצרים כאן את הבדיקות.
הערך 4 יכנס לתוך תא מספר 1.
הסיבה לכך שהערך יכנס לתא מספר 1 הוא כי אנו יודעים (במהלך הבדיקה) שהגענו לערך בהכרח קטן מ-temp ולכן התא מימינו הוא התא שנכון להכניס אליו את הערך ב-temp.
במקרה שלנו j היה שווה ל 0 ו j+1 ייתן לנו את תא מספר 1 והמערך שלנו יראה כך:

כעת אנו נתחיל את הסבב השלישי שלנו ונכניס לתוך המשתנה temp את הערך שנמצא בתוך תא מספר 3 (3).
כעת נתחיל להשוות את הערך ב-temp לערך שנמצא בתא מספר 2 (7).

בגלל שהערך 3 קטן מהערך 7 אנו נבצע החלפה.
הערך 7 יכנס לתא מספר 3 והמערך יראה כך:




לאחר מכן אנחנו משווים את הערך שב-temp לערך שבתא מספר 1 (4).


בגלל ש 3 קטן מ 4 אז גם כאן מתבצע שינוי והמערך שלנו יראה כעת כך:


לאחר מכן משווים את הערך 3 לערך 2 שנמצא בתוך תא מספר 0.

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


כעת אנחנו עושים את הסבב הרביעי שלנו וזה יהיה הסבב האחרון כי הגענו לסוף המערך.
לא קשה לראות שהערך 8 גדול יותר מכל האיברים במערך.
לכן כבר על ההשוואה הראשונה של הערך 8 לערך 7 אנו נבין שהמערך ממוין.
אין צורך להמשיך בהשוואות והמערך הסופי שלנו יראה כך:

ובכך מסיימים את מיון ההכנסה.


דוגמה לקוד של מיון הכנסה:

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

CODE 1:
#include <stdio.h>
void insertion_sort(int *arr,int size)
{
  int temp, i, j;
  for(i=1 ; i < size ; i++)
  {
    temp = arr[i];
    j = i - 1;

    while((j >= 0) && (temp < arr[j]))
    {
      arr[j + 1] = arr[j];
      j = j - 1;
    }

    arr[j + 1] = temp;
  }
}
            

i ו j אלו הם האינדקסים שבעזרתם אנו זזים בין תאים במערך.
i מסמל לנו את התא שהערך שלו יכנס למשתנה temp ו-j מציין את כל האיברים שאותם אנחנו נשווה לtemp.
while(j >= 0 && temp < arr[j]) – כל עוד לא הגענו לתא אפס וכל עוד הערך במשתנה העזר שלנו קטן יותר מאיברי המערך נמשיך לבצע החלפות של הערכים בתאים.