在实际应用当中,对于数据较大的输入,归并排序是比较快的一个算法。该算法采用的是分治法的思想。
原理:将数据分开排序,然后进行合并,最后形成一个排好的序列。
将其合并输出,如下图所示:
代码实现如下:
/** * 归并排序 * * @author Deters * @date 2019/10/12 */ public class MergeSort { /** * 归并 */ private static void merge(Integer[] array, int start, int end, int middle) { // 临时数组,储存左右分支合并之后的数组 Integer[] temp = new Integer[end - start + 1]; // 临时数组当前位置下标 int index = 0; // 左分支下标 int lCt = start; // 右分支下标 int rCt = middle + 1; // 当左右分支都有数据时 while (lCt <= middle && rCt <= end) { temp[index++] = array[lCt] - array[rCt] < 0 ? array[lCt++] : array[rCt++]; } // 只有左分支有数据 while (lCt <= middle) { temp[index++] = array[lCt++]; } // 只有右分支有数据 while (rCt <= end) { temp[index++] = array[rCt++]; } for (int i = 0; i < temp.length; i++) { array[start++] = temp[i]; } } /** * 分支排序 */ private static void mergeSort(Integer[] array, int start, int end) { int middle = start + (end - start) / 2; if (start < end) { // 左分支分割 mergeSort(array, start, middle); // 右分支分割 mergeSort(array, middle + 1, end); // 分支排序并合并 merge(array, start, end, middle); System.out.println(Arrays.toString(array)); } } public static void main(String[] args) { Random random = new Random(); Integer[] integers = new Integer[8]; // 建立数组 for (int i = 0; i < 8; i++) { integers[i] = random.nextInt(10); } // 归并排序 mergeSort(integers, 0, integers.length - 1); } }