אלגוריתם MergeSort ב-C וב-Java

העדכון אחרון: 6 מרץ של 2026
מחבר: TecnoDigital
  • MergeSort משתמש בשיטת הפרד וכבוש כדי למיין באופן רקורסיבי, יעיל על קבוצות גדולות.
  • סיבוכיות זמן: O(n log n), מועדף בהשוואה לאלגוריתמים ריבועיים כמו Bubble או Selection.
  • זה יציב: זה שומר על הסדר היחסי של כפילויות, שימושי כאשר הסדר הראשוני חשוב.
  • זה דורש זיכרון נוסף לכל תת-מערך; ניתן לשלב אותו עם טכניקות אחרות כדי לייעל את הביצועים.
אלגוריתם מיזוג מיון

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

במאמר זה נתמקד ביישום אלגוריתם MergeSort בשפות התכנות C ו-Java. נחקור שלב אחר שלב כיצד אלגוריתם זה פועל וכיצד ניתן להשתמש בו בפרויקטים שלכם. נדון גם בסיבוכיות הזמן של MergeSort ונשווה את ביצועיו לאלגוריתמי מיון אחרים.

אלגוריתם MergeSort ב-C וב-Java

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

יישום MergeSort ב-C

הנה יישום של אלגוריתם MergeSort ב-C:

#include <stdio.h>

void merge(int arr[], int left[], int right[], int left_size, int right_size) {
    int i = 0, j = 0, k = 0;
    
    while (i < left_size && j < right_size) {
        if (left[i] <= right[j]) {
            arr[k] = left[i];
            i++;
        } else {
            arr[k] = right[j];
            j++;
        }
        k++;
    }
    
    while (i < left_size) {
        arr[k] = left[i];
        i++;
        k++;
    }
    
    while (j < right_size) {
        arr[k] = right[j];
        j++;
        k++;
    }
}

void mergeSort(int arr[], int size) {
    if (size < 2) {
        return;
    }
    
    int mid = size / 2;
    int left[mid];
    int right[size - mid];
    
    for (int i = 0; i < mid; i++) {
        left[i] = arr[i];
    }
    
    for (int i = mid; i < size; i++) {
        right[i - mid] = arr[i];
    }
    
    mergeSort(left, mid);
    mergeSort(right, size - mid);
    merge(arr, left, right, mid, size - mid);
}

int main() {
    int arr[] = {9, 5, 2, 7, 1, 8, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    mergeSort(arr, size);
    
    printf("Sorted array: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

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

  טיפול בקבצים בשפת C דוגמאות: מדריך מלא

הטמעת MergeSort ב-Java

כעת, בואו נראה כיצד ליישם את אלגוריתם MergeSort ב-Java:

public class MergeSort {
    public static void merge(int[] arr, int[] left, int[] right) {
        int i = 0, j = 0, k = 0;

        while (i < left.length && j < right.length) {
            if (left[i] <= right[j]) {
                arr[k] = left[i];
                i++;
            } else {
                arr[k] = right[j];
                j++;
            }
            k++;
        }

        while (i < left.length) {
            arr[k] = left[i];
            i++;
            k++;
        }

        while (j < right.length) {
            arr[k] = right[j];
            j++;
            k++;
        }
    }

    public static void mergeSort(int[] arr) {
        if (arr.length < 2) {
            return;
        }

        int mid = arr.length / 2;
        int[] left = new int[mid];
        int[] right = new int[arr.length - mid];

        System.arraycopy(arr, 0, left, 0, mid);
        System.arraycopy(arr, mid, right, 0, arr.length - mid);

        mergeSort(left);
        mergeSort(right);
        merge(arr, left, right);
    }

    public static void main(String[] args) {
        int[] arr = {9, 5, 2, 7, 1, 8, 3};

        mergeSort(arr);

        System.out.print("Sorted array: ");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

ביישום זה של MergeSort ב-Java, אנו משתמשים בשיטות סטטיות עבור הפונקציה merge y mergeSort. הפונקציה merge מבצע את אותה משימה כמו ביישום C, ואת הפונקציה mergeSort עוקב אחר אותו היגיון של פיצול ושילוב של מערכי משנה. בפונקציה main, אנו יוצרים מערך בדיקה, אנו קוראים mergeSort ואנחנו מציגים את המערך הממוין בקונסולה.

מהי מורכבות הזמן של אלגוריתם MergeSort?

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

השוואה של MergeSort עם אלגוריתמי מיון אחרים

MergeSort בולטת ביעילותה במיון נתונים. בהשוואה לאלגוריתמים פופולריים אחרים כמו Bubble Sort או Selection Sort, ל-MergeSort יש מורכבות זמן טובה בהרבה. בעוד ל-Bubble Sort ול-Selection Sort יש מורכבות זמן של O(n^2), ל-MergeSort יש מורכבות זמן של O(n log n). המשמעות היא ש-MergeSort מסוגלת לטפל בכמויות גדולות של נתונים בצורה יעילה ומהירה יותר מאלגוריתמים פחות יעילים אלה.

  דוגמאות של אלגוריתמים גנטיים

שאלות נפוצות

1: מדוע להשתמש ב-MergeSort במקום באלגוריתמי מיון אחרים?

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

2: מתי עלי להשתמש ב-MergeSort בפרויקטים שלי?

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

3: האם יש חסרונות לשימוש ב-MergeSort?

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

4: האם MergeSort יכול לטפל ברכיבים כפולים במערך?

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

  האלגוריתם של לוהן: מה זה, איך זה עובד ויישומים

5: האם יש גרסאות או שיפורים לאלגוריתם MergeSort?

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

6: היכן אוכל ללמוד עוד על MergeSort ואלגוריתמי מיון אחרים?

אם אתה רוצה ללמוד עוד על MergeSort ואלגוריתמי מיון אחרים, אתה יכול לבדוק את המשאבים הבאים:

מסקנה

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

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

חקור והתנסה עם MergeSort בפרויקטים שלך כדי לקצור את היתרונות שלו וליהנות מביצועי מיון נתונים מיטביים!