Merge Sort Algorithm

Algorithm Learning Journey

The Merge Sort algorithm is an algorithm that has the principle/way of dividing and merging. What is meant by dividing is breaking an array into small fractions that cannot be divided, then the array is sorted at the same time as the process of merging the array. In the combining stage the sorting process occurs, not in the dividing/splitting process.

Illustration
There is an array.

Then we break array into 2 parts (left & right). By creating a new array then entering the array values.

Then break again until n(array length) <= 1.

Then the next stage, the values ​​are combined and sorted, smaller values ​​on the left side & larger values ​​on the right.

For the complete process.

Code Implementation
Java

<span>public</span> <span>static</span> <span>void</span> <span>mergeSort</span><span>(</span><span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
<span>int</span> <span>n</span> <span>=</span> <span>array</span><span>.</span><span>length</span><span>;</span>
<span>if</span><span>(</span><span>n</span> <span><=</span> <span>1</span><span>)</span> <span>return</span><span>;</span>
<span>int</span> <span>middle</span> <span>=</span> <span>(</span><span>n</span> <span>/</span> <span>2</span><span>);</span>
<span>int</span><span>[]</span> <span>left</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>middle</span><span>];</span>
<span>int</span><span>[]</span> <span>right</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>n</span> <span>-</span> <span>middle</span><span>];</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span> <span>i</span> <span><</span> <span>middle</span><span>;</span> <span>i</span><span>++)</span> <span>{</span>
<span>left</span><span>[</span><span>i</span><span>]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
<span>}</span>
<span>int</span> <span>supportIndex</span> <span>=</span> <span>0</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>middle</span><span>;</span> <span>i</span> <span><</span> <span>n</span><span>;</span> <span>i</span><span>++)</span> <span>{</span>
<span>right</span><span>[</span><span>supportIndex</span><span>++]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
<span>}</span>
<span>mergeSort</span><span>(</span><span>left</span><span>);</span>
<span>mergeSort</span><span>(</span><span>right</span><span>);</span>
<span>merge</span><span>(</span><span>left</span><span>,</span> <span>right</span><span>,</span> <span>array</span><span>);</span>
<span>}</span>
<span>private</span> <span>static</span> <span>void</span> <span>merge</span><span>(</span><span>int</span><span>[]</span> <span>left</span><span>,</span> <span>int</span><span>[]</span> <span>right</span><span>,</span> <span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
<span>int</span> <span>leftIndex</span> <span>=</span> <span>0</span><span>,</span>
<span>rightIndex</span> <span>=</span> <span>0</span><span>,</span>
<span>arrayIndex</span> <span>=</span> <span>0</span><span>,</span>
<span>leftSize</span> <span>=</span> <span>left</span><span>.</span><span>length</span><span>,</span>
<span>rightSize</span> <span>=</span> <span>right</span><span>.</span><span>length</span><span>;</span>
<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>static</span> <span>void</span> <span>mergeSort</span><span>(</span><span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
    <span>int</span> <span>n</span> <span>=</span> <span>array</span><span>.</span><span>length</span><span>;</span>
    <span>if</span><span>(</span><span>n</span> <span><=</span> <span>1</span><span>)</span> <span>return</span><span>;</span>

    <span>int</span> <span>middle</span> <span>=</span> <span>(</span><span>n</span> <span>/</span> <span>2</span><span>);</span>
    <span>int</span><span>[]</span> <span>left</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>middle</span><span>];</span>
    <span>int</span><span>[]</span> <span>right</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>n</span> <span>-</span> <span>middle</span><span>];</span>

    <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span> <span>i</span> <span><</span> <span>middle</span><span>;</span> <span>i</span><span>++)</span> <span>{</span>
        <span>left</span><span>[</span><span>i</span><span>]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
    <span>}</span>
    <span>int</span> <span>supportIndex</span> <span>=</span> <span>0</span><span>;</span>
    <span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>middle</span><span>;</span> <span>i</span> <span><</span> <span>n</span><span>;</span> <span>i</span><span>++)</span> <span>{</span>
        <span>right</span><span>[</span><span>supportIndex</span><span>++]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
    <span>}</span>

    <span>mergeSort</span><span>(</span><span>left</span><span>);</span>
    <span>mergeSort</span><span>(</span><span>right</span><span>);</span>
    <span>merge</span><span>(</span><span>left</span><span>,</span> <span>right</span><span>,</span> <span>array</span><span>);</span>
<span>}</span>

<span>private</span> <span>static</span> <span>void</span> <span>merge</span><span>(</span><span>int</span><span>[]</span> <span>left</span><span>,</span> <span>int</span><span>[]</span> <span>right</span><span>,</span> <span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
    <span>int</span> <span>leftIndex</span> <span>=</span> <span>0</span><span>,</span>
        <span>rightIndex</span> <span>=</span> <span>0</span><span>,</span>
        <span>arrayIndex</span> <span>=</span> <span>0</span><span>,</span>
        <span>leftSize</span> <span>=</span> <span>left</span><span>.</span><span>length</span><span>,</span>
        <span>rightSize</span> <span>=</span> <span>right</span><span>.</span><span>length</span><span>;</span>

    <span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
        <span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
            <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
        <span>}</span>
        <span>else</span> <span>{</span>
            <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
        <span>}</span>
    <span>}</span>

    <span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
        <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
    <span>}</span>
    <span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
        <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
    <span>}</span>
<span>}</span>
public static void mergeSort(int[] array) { int n = array.length; if(n <= 1) return; int middle = (n / 2); int[] left = new int[middle]; int[] right = new int[n - middle]; for(int i = 0; i < middle; i++) { left[i] = array[i]; } int supportIndex = 0; for(int i = middle; i < n; i++) { right[supportIndex++] = array[i]; } mergeSort(left); mergeSort(right); merge(left, right, array); } private static void merge(int[] left, int[] right, int[] array) { int leftIndex = 0, rightIndex = 0, arrayIndex = 0, leftSize = left.length, rightSize = right.length; while(leftIndex < leftSize && rightIndex < rightSize) { if(left[leftIndex] < right[rightIndex]) { array[arrayIndex++] = left[leftIndex++]; } else { array[arrayIndex++] = right[rightIndex++]; } } while(leftIndex < leftSize) { array[arrayIndex++] = left[leftIndex++]; } while(rightIndex < rightSize) { array[arrayIndex++] = right[rightIndex++]; } }

Enter fullscreen mode Exit fullscreen mode

This code runs and works, but it’s not effective enough, let’s fix it. First when looking at this code, like 1 thing we want to do is move the array values ​​to the left and right arrays.

<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span> <span>i</span> <span><</span> <span>middle</span><span>;</span> <span>i</span><span>++)</span> <span>{</span>
<span>left</span><span>[</span><span>i</span><span>]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
<span>}</span>
<span>int</span> <span>supportIndex</span> <span>=</span> <span>0</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>middle</span><span>;</span> <span>i</span> <span><</span> <span>n</span><span>;</span> <span>i</span><span>++)</span>
<span>right</span><span>[</span><span>supportIndex</span><span>++]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
<span>}</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>0</span><span>;</span> <span>i</span> <span><</span> <span>middle</span><span>;</span> <span>i</span><span>++)</span> <span>{</span>
    <span>left</span><span>[</span><span>i</span><span>]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
<span>}</span>
<span>int</span> <span>supportIndex</span> <span>=</span> <span>0</span><span>;</span>
<span>for</span><span>(</span><span>int</span> <span>i</span> <span>=</span> <span>middle</span><span>;</span> <span>i</span> <span><</span> <span>n</span><span>;</span> <span>i</span><span>++)</span> 
    <span>right</span><span>[</span><span>supportIndex</span><span>++]</span> <span>=</span> <span>array</span><span>[</span><span>i</span><span>];</span>
<span>}</span>
for(int i = 0; i < middle; i++) { left[i] = array[i]; } int supportIndex = 0; for(int i = middle; i < n; i++) right[supportIndex++] = array[i]; }

Enter fullscreen mode Exit fullscreen mode

So let’s fix with a function on Arrays.

<span>import</span> <span>java.util.Arrays</span><span>;</span>
<span>...</span>
<span>// Nice</span>
<span>left</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>0</span><span>,</span> <span>middle</span><span>);</span>
<span>right</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>middle</span><span>,</span> <span>n</span><span>);</span>
<span>import</span> <span>java.util.Arrays</span><span>;</span>
<span>...</span>
<span>// Nice</span>
<span>left</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>0</span><span>,</span> <span>middle</span><span>);</span>
<span>right</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>middle</span><span>,</span> <span>n</span><span>);</span>
import java.util.Arrays; ... // Nice left = Arrays.copyOfRange(array, 0, middle); right = Arrays.copyOfRange(array, middle, n);

Enter fullscreen mode Exit fullscreen mode

Then the second is this code.

<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
    <span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
        <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
    <span>}</span>
    <span>else</span> <span>{</span>
        <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
    <span>}</span>
<span>}</span>

<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
    <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
    <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
while(leftIndex < leftSize && rightIndex < rightSize) { if(left[leftIndex] < right[rightIndex]) { array[arrayIndex++] = left[leftIndex++]; } else { array[arrayIndex++] = right[rightIndex++]; } } while(leftIndex < leftSize) { array[arrayIndex++] = left[leftIndex++]; } while(rightIndex < rightSize) { array[arrayIndex++] = right[rightIndex++]; }

Enter fullscreen mode Exit fullscreen mode

This code aims to sort the array and apply it to the original array, so let’s make it one “while”.

<span>while</span> <span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>||</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>else</span> <span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>if</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>while</span> <span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>||</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
    <span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
        <span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
            <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
        <span>}</span>
        <span>else</span> <span>{</span>
            <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
        <span>}</span>
    <span>}</span>
    <span>else</span> <span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
        <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
    <span>}</span>
    <span>else</span> <span>if</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
        <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
    <span>}</span>
<span>}</span>
while (leftIndex < leftSize || rightIndex < rightSize) { if(leftIndex < leftSize && rightIndex < rightSize) { if(left[leftIndex] < right[rightIndex]) { array[arrayIndex++] = left[leftIndex++]; } else { array[arrayIndex++] = right[rightIndex++]; } } else if(leftIndex < leftSize) { array[arrayIndex++] = left[leftIndex++]; } else if(rightIndex < rightSize) { array[arrayIndex++] = right[rightIndex++]; } }

Enter fullscreen mode Exit fullscreen mode

And this statement is interesting.

<span>else</span> <span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>if</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
    <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>if</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
    <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
else if(leftIndex < leftSize) { array[arrayIndex++] = left[leftIndex++]; } else if(rightIndex < rightSize) { array[arrayIndex++] = right[rightIndex++]; }

Enter fullscreen mode Exit fullscreen mode

Let’s simplify it

<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
    <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
    <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
while(leftIndex < leftSize) { array[arrayIndex++] = left[leftIndex++]; } while(rightIndex < rightSize) { array[arrayIndex++] = right[rightIndex++]; }

Enter fullscreen mode Exit fullscreen mode

Lastly, for the complete code.

<span>public</span> <span>static</span> <span>void</span> <span>mergeSort</span><span>(</span><span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
<span>int</span> <span>n</span> <span>=</span> <span>array</span><span>.</span><span>length</span><span>;</span>
<span>if</span><span>(</span><span>n</span> <span><=</span> <span>1</span><span>)</span> <span>return</span><span>;</span>
<span>int</span> <span>middle</span> <span>=</span> <span>(</span><span>n</span> <span>/</span> <span>2</span><span>);</span>
<span>int</span><span>[]</span> <span>left</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>middle</span><span>];</span>
<span>int</span><span>[]</span> <span>right</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>n</span> <span>-</span> <span>middle</span><span>];</span>
<span>left</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>0</span><span>,</span> <span>middle</span><span>);</span>
<span>right</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>middle</span><span>,</span> <span>n</span><span>);</span>
<span>mergeSort</span><span>(</span><span>left</span><span>);</span>
<span>mergeSort</span><span>(</span><span>right</span><span>);</span>
<span>merge</span><span>(</span><span>left</span><span>,</span> <span>right</span><span>,</span> <span>array</span><span>);</span>
<span>}</span>
<span>private</span> <span>static</span> <span>void</span> <span>merge</span><span>(</span><span>int</span><span>[]</span> <span>left</span><span>,</span> <span>int</span><span>[]</span> <span>right</span><span>,</span> <span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
<span>int</span> <span>leftIndex</span> <span>=</span> <span>0</span><span>,</span>
<span>rightIndex</span> <span>=</span> <span>0</span><span>,</span>
<span>arrayIndex</span> <span>=</span> <span>0</span><span>,</span>
<span>leftSize</span> <span>=</span> <span>left</span><span>.</span><span>length</span><span>,</span>
<span>rightSize</span> <span>=</span> <span>right</span><span>.</span><span>length</span><span>;</span>
<span>while</span> <span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>||</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>else</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
<span>}</span>
<span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
<span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>static</span> <span>void</span> <span>mergeSort</span><span>(</span><span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
    <span>int</span> <span>n</span> <span>=</span> <span>array</span><span>.</span><span>length</span><span>;</span>
    <span>if</span><span>(</span><span>n</span> <span><=</span> <span>1</span><span>)</span> <span>return</span><span>;</span>

    <span>int</span> <span>middle</span> <span>=</span> <span>(</span><span>n</span> <span>/</span> <span>2</span><span>);</span>
    <span>int</span><span>[]</span> <span>left</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>middle</span><span>];</span>
    <span>int</span><span>[]</span> <span>right</span> <span>=</span> <span>new</span> <span>int</span><span>[</span><span>n</span> <span>-</span> <span>middle</span><span>];</span>

    <span>left</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>0</span><span>,</span> <span>middle</span><span>);</span>
    <span>right</span> <span>=</span> <span>Arrays</span><span>.</span><span>copyOfRange</span><span>(</span><span>array</span><span>,</span> <span>middle</span><span>,</span> <span>n</span><span>);</span>

    <span>mergeSort</span><span>(</span><span>left</span><span>);</span>
    <span>mergeSort</span><span>(</span><span>right</span><span>);</span>
    <span>merge</span><span>(</span><span>left</span><span>,</span> <span>right</span><span>,</span> <span>array</span><span>);</span>
<span>}</span>

<span>private</span> <span>static</span> <span>void</span> <span>merge</span><span>(</span><span>int</span><span>[]</span> <span>left</span><span>,</span> <span>int</span><span>[]</span> <span>right</span><span>,</span> <span>int</span><span>[]</span> <span>array</span><span>)</span> <span>{</span>
    <span>int</span> <span>leftIndex</span> <span>=</span> <span>0</span><span>,</span>
        <span>rightIndex</span> <span>=</span> <span>0</span><span>,</span>
        <span>arrayIndex</span> <span>=</span> <span>0</span><span>,</span>
        <span>leftSize</span> <span>=</span> <span>left</span><span>.</span><span>length</span><span>,</span>
        <span>rightSize</span> <span>=</span> <span>right</span><span>.</span><span>length</span><span>;</span>

    <span>while</span> <span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>||</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
        <span>if</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span> <span>&&</span> <span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
            <span>if</span><span>(</span><span>left</span><span>[</span><span>leftIndex</span><span>]</span> <span><</span> <span>right</span><span>[</span><span>rightIndex</span><span>])</span> <span>{</span>
                <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
            <span>}</span>
            <span>else</span> <span>{</span>
                <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
            <span>}</span>
        <span>}</span>
        <span>while</span><span>(</span><span>leftIndex</span> <span><</span> <span>leftSize</span><span>)</span> <span>{</span>
            <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>left</span><span>[</span><span>leftIndex</span><span>++];</span>
        <span>}</span>
        <span>while</span><span>(</span><span>rightIndex</span> <span><</span> <span>rightSize</span><span>)</span> <span>{</span>
            <span>array</span><span>[</span><span>arrayIndex</span><span>++]</span> <span>=</span> <span>right</span><span>[</span><span>rightIndex</span><span>++];</span>
        <span>}</span>
    <span>}</span>
<span>}</span>
public static void mergeSort(int[] array) { int n = array.length; if(n <= 1) return; int middle = (n / 2); int[] left = new int[middle]; int[] right = new int[n - middle]; left = Arrays.copyOfRange(array, 0, middle); right = Arrays.copyOfRange(array, middle, n); mergeSort(left); mergeSort(right); merge(left, right, array); } private static void merge(int[] left, int[] right, int[] array) { int leftIndex = 0, rightIndex = 0, arrayIndex = 0, leftSize = left.length, rightSize = right.length; while (leftIndex < leftSize || rightIndex < rightSize) { if(leftIndex < leftSize && rightIndex < rightSize) { if(left[leftIndex] < right[rightIndex]) { array[arrayIndex++] = left[leftIndex++]; } else { array[arrayIndex++] = right[rightIndex++]; } } while(leftIndex < leftSize) { array[arrayIndex++] = left[leftIndex++]; } while(rightIndex < rightSize) { array[arrayIndex++] = right[rightIndex++]; } } }

Enter fullscreen mode Exit fullscreen mode

Enjoy your journey 🙂

原文链接:Merge Sort Algorithm

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
Little compliments mean so much to me sometimes.
有时候,一点微不足道的肯定,对我却意义非凡
评论 抢沙发

请登录后发表评论

    暂无评论内容