思路–分治
归并排序是利用归并的思想实现的排序算法,该算法采用经典的分治策略将问题分解成小的问题然后递归求解,而“治”的阶段则将分的阶段得到的答案“修补在一起”,即分而治之。
时间复杂度: n·logn
空间复杂度: 1
稳定性: 稳定
代码
public static void mergeSort(int[] arr,int left,int right,int[] temp){
if(left < right){
int mid = left + (rigth - left) / 2;
//递归向左分解
mergeSort(arr,left,mid,temp);
//递归向右分解
mergeSort(arr,mid+1,right,temp);
//合并
merge(arr,left,mid,right,temp);
}
}
public static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left;
int j = mid + 1;
int t= 0;
/*
* 分三步走
* 第一步:先将两半有序数组的数据放在temp数组中,直到其中一般没有数据了
* 第二步:将另一半的剩余数据依次放入temp数组
* 第三步:将temp数组的数据拷贝到arr中
* */
while(i <= mid && j <= right){
if(arr[i] <= arr[j){
temp[t++] = arr[i++];
}else{
temp[t++] = arr[j++];
}
}
while(i <= mid){
temp[t++] = arr[i++];
}
while(j <= right){
temp[t++] = arr[j++];
}
t = 0;
int tempLeft = left;
while(tempLeft <= right){
arr[tempLeft++] = temp[t++];
}
}