在实际应用当中,对于数据较大的输入,归并排序是比较快的一个算法。该算法采用的是分治法的思想。
原理:将数据分开排序,然后进行合并,最后形成一个排好的序列。

将其合并输出,如下图所示:

代码实现如下:
/**
* 归并排序
*
* @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);
}
}