定义:
归并排序,是一种创建在归并操作的基础上的排序算法,归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
基本思想:
归并排序是基于分治思想,分治模式在每一层递归上有三个步骤:
1. 分解:将n个元素分解成n/2个元素的子序列
2. 解决:用合并排序法将两个子序列排序
3. 合并:将两个有序的子序列合并
递归实现:
① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
③ 重复步骤②,直到所有元素排序完毕
图解分析:
图借鉴于https://www.jianshu.com/p/33cffa1ce613 ,班门弄斧,感谢🙏!主要是画的太好了
4. 代码实现
public static void MergeSortMethod(int[] arr) {
if (arr == null && arr.length < 0) {
return;
}
process(arr, 0, arr.length - 1);
}
//递归方法实现
private static void process(int[] arr, int L, int R) {
if (L == R) {
return;
}
//分解数组用的指针
int mid = L + ((R - L) >> 1);
process(arr, L, mid);
process(arr, mid + 1, R);
//合并
merge(arr, L, mid, R);
}
private static void merge(int[] arr, int l, int mid, int r) {
//辅助数组
int[] help = new int[r - l + 1];
//起始位置
int i = 0;
//左指针
int p1 = l;
//右指针
int p2 = mid+1;
//正常流程,左右子数组指针均没越界
while (p1<=mid &&p2<=r){
help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
//p2越界了
while (p1<=mid){
help[i++]=arr[p1++];
}
//p1越界了
while (p2<=r){
help[i++]=arr[p2++];
}
//将有序数组重新赋值回原数组
for (int j = 0; j < help.length; j++) {
arr[l+j] = help[j];
}
}
//main方法
public static void main(String[] args) {
int[] ints = {2,4,1,5,2};
MergeSortMethod(ints);
for (int i:ints
) {
System.out.println(i);
}
}
5. 复杂度
归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。