MergeSort-algoritmi C:ssä ja Javassa

Viimeisin päivitys: 6 maaliskuuta 2026
Kirjoittaja: TecnoDigital
  • MergeSort käyttää jakamis- ja hallintamenetelmää rekursiiviseen lajitteluun, mikä on tehokasta suurissa joukoissa.
  • Aikavaativuus: O(n log n), suotuisampi verrattuna kvadraattisiin algoritmeihin, kuten Bubble tai Selection.
  • Se on vakaa: se säilyttää kaksoiskappaleiden suhteellisen järjestyksen, mikä on hyödyllistä silloin, kun alkuperäisellä järjestyksellä on merkitystä.
  • Se vaatii lisää muistia alitaulukkoa kohden; sitä voidaan yhdistää muihin tekniikoihin suorituskyvyn optimoimiseksi.
MergeSort-algoritmi

Tietojen lajittelu on perustehtävä ohjelmoinnissa ja algoritmien analysoinnissa. Lajittelutekniikoita on monia, ja yksi tehokkaimmista on MergeSort-algoritmi. Tämä algoritmi käyttää "hajota ja hallitse" -lähestymistapaa elementtiluettelon lajittelemiseen rekursiivisesti.

Tässä artikkelissa keskitymme MergeSort -algoritmin toteuttamiseen C- ja Java-ohjelmointikielillä. Tutkimme askel askeleelta, miten tämä algoritmi toimii ja miten voit käyttää sitä omissa projekteissasi. Keskustelemme myös MergeSortin ajallisesta vaativuudesta ja vertaamme sen suorituskykyä muihin lajittelualgoritmeihin.

MergeSort-algoritmi C:ssä ja Javassa

MergeSort - algoritmi käyttää hajoita ja hallitse -strategiaa luettelon alkioiden lajitteluun. Prosessi suoritetaan kolmessa päävaiheessa: jaa, hallitse ja yhdistä. Katsotaanpa, miten tämä algoritmi toteutetaan C- ja Java-ohjelmointikielillä.

MergeSort-toteutus C:ssä

Tässä on MergeSort-algoritmin toteutus C:ssä:

#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;
}

Tässä toteutuksessa määritämme ensin funktion merge joka vastaa kahden järjestetyn aliryhmän yhdistämisestä päätaulukoksi. Sitten funktio mergeSort jakaa taulukon rekursiivisesti pienempiin aliryhmiin ja lajittelee ne funktion avulla merge. Lopuksi funktiossa main, luomme testitaulukon, kutsumme mergeSort ja näytämme tilatun järjestelyn näytöllä.

  Raa'an voiman algoritmit ohjelmoinnissa: mitä ne ovat, esimerkkejä ja eroja takaisinjäljitykseen verrattuna.

MergeSortin käyttöönotto Javassa

Katsotaanpa nyt, kuinka MergeSort-algoritmi toteutetaan Javassa:

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 + " ");
        }
    }
}

Tässä MergeSortin toteutuksessa Javassa käytämme funktiolle staattisia menetelmiä merge y mergeSort. toiminto merge suorittaa saman tehtävän kuin C-toteutuksessa ja toiminnon mergeSort noudattaa samaa aliryhmien jakamisen ja yhdistämisen logiikkaa. Toiminnassa main, luomme testitaulukon, kutsumme mergeSort ja näytämme lajitellun taulukon konsolissa.

Mikä on MergeSort-algoritmin aikamonimutkaisuus?

MergeSort-algoritmin aikamonimutkaisuus on O(n log n), jossa "n" edustaa lajiteltavan taulukon elementtien määrää. Tämä tarkoittaa, että algoritmin ajoaika kasvaa suhteessa "n":n ja "n":n 2-kantalogaritmin tuloon. Tämä monimutkaisuus tekee MergeSortista yhden tehokkaimmista saatavilla olevista lajittelualgoritmeista.

MergeSortin vertailu muihin lajittelualgoritmeihin

MergeSort erottuu tehokkuudestaan ​​tietojen lajittelussa. Verrattuna muihin suosittuihin algoritmeihin, kuten Bubble Sort tai Selection Sort, MergeSortilla on paljon parempi aika monimutkaisuus. Kuplalajittelun ja valintalajittelun aikamonimutkaisuus on O(n^2), kun taas MergeSortin aikamonimutkaisuus on O(n log n). Tämä tarkoittaa, että MergeSort pystyy käsittelemään suuria tietomääriä tehokkaammin ja nopeammin kuin nämä vähemmän tehokkaat algoritmit.

  Twofish: Kaikki tästä tehokkaasta salausalgoritmista

Usein kysytyt kysymykset

1: Miksi käyttää MergeSortia muiden lajittelualgoritmien sijaan?

MergeSort on parempi kuin muut lajittelualgoritmit sen tehokkuuden ja suorituskyvyn vuoksi. Kun aikamonimutkaisuus on O(n log n), MergeSort pystyy lajittelemaan suuria tietojoukkoja nopeammin ja tehokkaammin kuin algoritmit, joilla on neliötason monimutkaisuus, kuten Bubble Sort tai Selection Sort. Lisäksi MergeSort on vakaa algoritmi, mikä tarkoittaa, että se ylläpitää samanarvoisten elementtien suhteellista järjestystä, mikä voi olla tärkeää tietyissä yhteyksissä.

2: Milloin minun tulee käyttää MergeSortia projekteissani?

Voit harkita MergeSortin käyttöä, kun haluat lajitella suuria tietojoukkoja tehokkaasti. Jos sinulla on järjestämätön luettelo kohteista ja haluat saada lajitellun luettelon mahdollisimman lyhyessä ajassa, MergeSort on loistava vaihtoehto. Huomaa kuitenkin, että MergeSort saattaa vaatia enemmän muistitilaa muihin lajittelualgoritmeihin verrattuna, koska se luo ylimääräisiä aliryhmiä suorituksensa aikana.

3: Onko MergeSortin käytössä haittoja?

MergeSortin mahdollinen haittapuoli on sen ylimääräinen muistin käyttö. Algoritmin suorituksen aikana luodaan lisää aliryhmiä datan jakamiseksi ja yhdistämiseksi, mikä voi lisätä muistin tarvetta, erityisesti käytettäessä erittäin suuria tietojoukkoja. Useimmissa tapauksissa tämä haitta on kuitenkin merkityksetön verrattuna algoritmin tehokkuuteen.

4: Voiko MergeSort käsitellä päällekkäisiä elementtejä taulukossa?

Kyllä, MergeSort voi käsitellä taulukon päällekkäisiä elementtejä. Algoritmi on vakaa, eli se säilyttää samanarvoisten elementtien suhteellisen järjestyksen. Tämä on tärkeää, kun haluat säilyttää kohteiden alkuperäisen järjestyksen siltä varalta, että niissä on kaksoiskappaleita. MergeSort varmistaa, että päällekkäiset elementit näkyvät samassa suhteellisessa järjestyksessä sekä syöttötaulukossa että lajitetussa taulukossa.

  8 kiehtovaa faktaa Samuel Morsesta

5: Onko MergeSort-algoritmiin muunnelmia tai parannuksia?

Kyllä, MergeSort-algoritmiin on useita muunnelmia ja parannuksia. Joitakin näistä muunnelmista ovat iteratiivinen MergeSort, MergeSort, jossa on alitaulukoiden yhdistämisen optimointi, ja hybridi MergeSort, joka yhdistää MergeSortin toiseen lajittelualgoritmiin, kuten Insertion Sort, paremman suorituskyvyn saavuttamiseksi tietyissä tapauksissa. Nämä muunnelmat pyrkivät parantamaan MergeSort-algoritmin suorituskykyä ja tehokkuutta tietyissä tilanteissa.

6: Mistä voin oppia lisää MergeSortista ja muista lajittelualgoritmeista?

Jos haluat lisätietoja MergeSortista ja muista lajittelualgoritmeista, voit tutustua seuraaviin resursseihin:

Johtopäätös

Tässä artikkelissa olemme tutkineet MergeSort-algoritmia C- ja Java-ohjelmointikielissä. Olemme oppineet toteuttamaan tämän tehokkaan tiedonlajittelualgoritmin ja keskustelleet sen aikamonimutkaisuudesta. Yksityiskohtaisten esimerkkien ja selitysten avulla sinulla on nyt vankka käsitys siitä, kuinka MergeSort toimii C:ssä ja Javassa ja kuinka voit käyttää sitä omissa projekteissasi.

MergeSort on tehokas työkalu suurten tietojoukkojen lajitteluun, ja sen aikamonimutkaisuus O(n log n) tekee siitä houkuttelevan vaihtoehdon muihin vähemmän tehokkaisiin lajittelualgoritmeihin verrattuna. Jos sinun on lajiteltava tiedot tehokkaasti ja nopeasti, harkitse MergeSortin käyttämistä valitsemasi algoritmina.

Tutustu ja kokeile MergeSortia projekteissasi saadaksesi hyödyt ja nauttia optimaalisesta tietojen lajittelusta!