归并排序MergeSort_听韩顺平课笔记
作者:互联网
1.归并排序思想(分治:Divide-and-conquer)
将问题分成一些小问题,然后递归求解,将分的各阶段得到的答案"修补"到一起
2.归并排序时间复杂度O(nlogn)
归并排序需要额外的空间开销
3.归并排序
package 算法.排序;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[8];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*100+1);
}
int[] temp = new int[arr.length];
System.out.println(Arrays.toString(arr));
mergeSort(0,arr.length-1,arr,temp);
System.out.println(Arrays.toString(arr));
}
static void mergeSort(int left, int right, int[] arr, int[] temp){
int mid = 0;
if (left < right){
mid = (left+right)/2;
// 向左拆分
mergeSort(left,mid,arr,temp);
// 向右拆分
mergeSort(mid+1,right,arr,temp);
// 治
merge(left,right,mid,arr,temp);
}
}
static void merge(int left, int right, int mid, int[] arr, int[] temp){
//
int i = left;
int j = mid + 1;
int t = 0;
while(i <= mid && j <= right){ // 这里j<=right,不能写成j<arr.length,且right=arr.length-1
if (arr[i] <= arr[j]){ // 升序
temp[t] = arr[i];
i ++;
t ++;
}else{
temp[t] = arr[j];
j ++;
t ++;
}
}
while(i <= mid){
temp[t] = arr[i];
i ++;
t ++;
}
while(j <= right){
temp[t] = arr[j];
j ++;
t ++;
}
// 拷贝,第一次写忘了拷贝这一步,将临时数组中的元素拷贝到数组中,
// 这里用for,arr.length的方式,不合理,temp的长度一直是和arr一致的,
t = 0 ;
int tempLeft = left;
while(tempLeft <= right){
arr[tempLeft] = temp[t];
t ++;
tempLeft ++;
}
}
}
标签:MergeSort,归并,right,temp,arr,int,mid,left,顺平 来源: https://www.cnblogs.com/CH0701/p/15343903.html