Αλγόριθμος MergeSort σε C και Java

Τελευταία ενημέρωση: 6 Μαρτίου 2026
Συγγραφέας: TecnoDigital
  • Το MergeSort χρησιμοποιεί τη μέθοδο διαίρει και βασίλευε για αναδρομική ταξινόμηση, αποτελεσματική σε μεγάλα σύνολα.
  • Χρονική πολυπλοκότητα: O(n log n), ευνοϊκή σε σύγκριση με τετραγωνικούς αλγόριθμους όπως το Bubble ή το Selection.
  • Είναι σταθερό: διατηρεί τη σχετική σειρά των διπλότυπων, κάτι χρήσιμο όταν η αρχική σειρά έχει σημασία.
  • Απαιτεί επιπλέον μνήμη ανά υποπίνακα· μπορεί να συνδυαστεί με άλλες τεχνικές για βελτιστοποίηση της απόδοσης.
Αλγόριθμος MergeSort

Η ταξινόμηση δεδομένων είναι μια θεμελιώδης εργασία στον προγραμματισμό και την ανάλυση αλγορίθμων. Υπάρχουν πολλές διαθέσιμες τεχνικές ταξινόμησης και μία από τις πιο αποτελεσματικές είναι ο αλγόριθμος 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 και δείχνουμε την τακτοποιημένη διάταξη στην οθόνη.

  Αλγόριθμοι ωμής βίας στον προγραμματισμό: τι είναι, παραδείγματα και διαφορές με την οπισθοδρόμηση.

Εφαρμογή 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 έχει πολύ καλύτερη χρονική πολυπλοκότητα. Ενώ η Ταξινόμηση με Φούσκα και η Ταξινόμηση Επιλογής έχουν χρονική πολυπλοκότητα O(n^2), η συγχώνευση έχει χρονική πολυπλοκότητα O(n log n). Αυτό σημαίνει ότι το MergeSort είναι σε θέση να χειρίζεται μεγάλους όγκους δεδομένων πιο αποτελεσματικά και πιο γρήγορα από αυτούς τους λιγότερο αποδοτικούς αλγόριθμους.

  Twofish: Όλα για αυτόν τον ισχυρό αλγόριθμο κρυπτογράφησης

Συχνές ερωτήσεις

1: Γιατί να χρησιμοποιήσετε το MergeSort αντί για άλλους αλγόριθμους ταξινόμησης;

Το MergeSort προτιμάται έναντι άλλων αλγορίθμων ταξινόμησης λόγω της αποτελεσματικότητας και της απόδοσής του. Με χρονική πολυπλοκότητα O(n log n), το MergeSort είναι σε θέση να ταξινομεί μεγάλα σύνολα δεδομένων ταχύτερα και πιο αποτελεσματικά από αλγόριθμους με τετραγωνική πολυπλοκότητα, όπως Ταξινόμηση με Φούσκα ή Ταξινόμηση Επιλογής. Επιπλέον, το MergeSort είναι ένας σταθερός αλγόριθμος, που σημαίνει ότι διατηρεί τη σχετική σειρά στοιχείων με ίσες τιμές, κάτι που μπορεί να είναι σημαντικό σε ορισμένα περιβάλλοντα.

2: Πότε πρέπει να χρησιμοποιήσω το MergeSort στα έργα μου;

Μπορείτε να χρησιμοποιήσετε το MergeSort όταν χρειάζεται να ταξινομήσετε μεγάλα σύνολα δεδομένων αποτελεσματικά. Εάν έχετε μια μη ταξινομημένη λίστα αντικειμένων και θέλετε να λάβετε μια ταξινομημένη λίστα στο συντομότερο δυνατό χρόνο, το MergeSort είναι μια εξαιρετική επιλογή. Ωστόσο, σημειώστε ότι το MergeSort μπορεί να απαιτεί περισσότερο χώρο στη μνήμη σε σύγκριση με άλλους αλγόριθμους ταξινόμησης, επειδή δημιουργεί πρόσθετους υποπίνακες κατά την εκτέλεσή του.

3: Υπάρχουν μειονεκτήματα στη χρήση του MergeSort;

Ένα πιθανό μειονέκτημα του MergeSort είναι η πρόσθετη χρήση μνήμης. Κατά την εκτέλεση του αλγορίθμου, δημιουργούνται πρόσθετες υποσυστοιχίες για διαχωρισμό και συνδυασμό των δεδομένων, γεγονός που μπορεί να αυξήσει τις απαιτήσεις μνήμης, ειδικά όταν εργάζεστε με πολύ μεγάλα σύνολα δεδομένων. Ωστόσο, στις περισσότερες περιπτώσεις, αυτό το μειονέκτημα είναι ασήμαντο σε σύγκριση με την αποτελεσματικότητα του αλγορίθμου.

4: Μπορεί το MergeSort να χειριστεί διπλά στοιχεία στον πίνακα;

Ναι, το MergeSort μπορεί να χειριστεί διπλά στοιχεία στον πίνακα. Ο αλγόριθμος είναι σταθερός, δηλαδή διατηρεί τη σχετική σειρά των στοιχείων με ίσες τιμές. Αυτό είναι σημαντικό όταν θέλετε να διατηρήσετε την αρχική σειρά των αντικειμένων σε περίπτωση που υπάρχουν διπλότυπα. Το MergeSort διασφαλίζει ότι τα διπλά στοιχεία εμφανίζονται με την ίδια σχετική σειρά τόσο στον πίνακα εισόδου όσο και στον ταξινομημένο πίνακα.

  8 συναρπαστικά γεγονότα για τον Samuel Morse

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 στα έργα σας για να αποκομίσετε τα οφέλη του και να απολαύσετε τη βέλτιστη απόδοση ταξινόμησης δεδομένων!