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.
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
暂无评论内容