思路:
- 1.把长度为n的输入序列分成两个长度为n/2的子序列;
- 2.对这两个子序列分别采用归并排序;
- 3.将两个排序好的子序列合并成一个最终的排序序列。
动图点这里:.html
代码实现:
public static void mergeSort(int[] arr,int l,int r,int[] tmp){
if(l < r){//分到一个元素
int mid = (l+r)/2;//找到分界点
mergeSort(arr,l,mid,tmp);//左边继续进行分思想
mergeSort(arr,mid + 1,r,tmp);//右边继续进行分思想
merger(arr,l,mid,r,tmp);//当分到只剩一个元素时进行合并
}
}
public static void merger(int[] arr,int left,int mid,int right,int[] tmp){
int i = left;
int j = mid + 1;
int t = 0;
while(i <= mid && j <= right){//左右分区都有元素
if(arr[i] <= arr[j]){
tmp[t++] = arr[i++];
}else{
tmp[t++] = arr[j++];
}
}
while(i <= mid){//右分区没有元素,左分区还有元素
tmp[t++] = arr[i++];
}
while(j <= right){//左分区没有元素,右分区还有元素
tmp[t++] = arr[j++];
}
t = 0;
while(left <= right){//从临时数组中拷贝元素到arr
arr[left++] = tmp[t++];
}
}
复杂度分析: