一.归并排序原理
1.拆分(以二分归并排序为例:将一个数组折半拆分为两个数组,直到不可拆分)
2.比较(元素之间两两进行比较)
3.归并(元素比较完成后进行合并)
用百度百科的一张图更加方便地理解:

归并排序是一种稳定的排序算法,但是用到了递归,比较消耗内存。
二.归并排序时间复杂度分析
归并排序的时间复杂度包括分解,比较,合并。
最好的情况下,数组是已排序的,那么归并排序的时间复杂度为O(n)级的。
最坏的情况下,数组是逆序的,那么归并排序的时间复杂度为O(nlogn)级的。归并排序的平均时间复杂度是O(nlogn)。
三.代码实现(Java)
package json.study;
import java.util.Arrays;
public class Test05 {
static int number=0;
public static void main(String[] args) {
int[] arr = {9,8,7,5,6,1,2,3,4};
cutAndSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void cutAndSort(int[] arr) {
cutAndSort(arr, 0, arr.length - 1);
}
private static void cutAndSort(int[] arr, int left, int right) {//方法重载,用递归方法折半拆分数组并排序
//如果数组只有一个元素则直接退出,否则
if(left==right)
return;
int mid = (left + right) / 2;
cutAndSort(arr, left, mid);//左边排好序后的数组
cutAndSort(arr, mid + 1, right);//右边排好序后的数组
merge(arr, left, mid, right);
}
private static void merge(int[] arr, int left, int mid, int right) {
int[] tmp = new int[arr.length];
int rIndex = mid + 1;
int tIndex = left;
int cIndex = left;
while(left <=mid && rIndex <= right) {
if (arr[left] <= arr[rIndex])
tmp[tIndex++] = arr[left++];
else
tmp[tIndex++] = arr[rIndex++];
}
// 将左边剩余的归并
while (left <=mid) {
tmp[tIndex++] = arr[left++];
}
// 将右边剩余的归并
while (rIndex <= right) {
tmp[tIndex++] = arr[rIndex++];
}
while(cIndex<=right){
arr[cIndex]=tmp[cIndex];
cIndex++;
}
}
}
测试结果如下:
![]()
来源:https://www.cnblogs.com/ywb-articles/p/10706849.html