核心思想:递归
算法思路:一是分,二是治,分是将待排序数组划分为更小数组的过程,治是将两个数组有序排列并合并,直至还原到原数组长度。
算法性能:仅次于快速排序
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定性:稳定
算法图解:
代码实现:
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
int[] arr = new int[20];
for(int i = 0;i < 20;i++){
int number = random.nextInt(100);
arr[i] = number;
}
for(int arr1:arr){
System.out.print(arr1+" ");
}
System.out.println();
int[] arr1 = mergeSort(arr,0,arr.length - 1);
for(int arr2:arr1){
System.out.print(arr2+" ");
}
}
public static int[] mergeSort(int[] arr,int b,int e){
//只剩一个数时停止分裂,并返回
if(b == e){
return new int[]{arr[b]};
}
//中间值mind
int mind = b+(e-b)/2;
int[] leftArr = mergeSort(arr,b,mind);//左数组递归分裂
int[] rightArr = mergeSort(arr,mind+1,e);//又数组递归分裂
int[] temp = new int[leftArr.length+rightArr.length];//中间数组,做合并准备
int m = 0,i = 0,n = 0;
//开始合并,比较大小放入中间数组
while(i < leftArr.length && n < rightArr.length){
temp[m++] = leftArr[i]<rightArr[n] ? leftArr[i++] : rightArr[n++];
}
//待合并数组长度不同时的情况,将剩余元素放入数组
while(i < leftArr.length){
temp[m++] = leftArr[i++];
}
while(n < rightArr.length ){
temp[m++] = rightArr[n++];
}
return temp;
}
}
运行结果:
文章可能存在不足之处,欢迎大家交流指正。