时间复杂度 O(nlogn)
用LeetCode912题 排序数组 去验证写的代码是不是对的
package sort;
import java.util.Arrays;
public class MyMergeSort {
public void sort(int[] arr) {
int len = arr.length;
mergeSort(arr, 0, len - 1);
}
//两边都能取到
private void mergeSort(int[] arr, int left, int right) {
if (left >= right) { //只有一个元素,返回
return;
}
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
// [left, mid] 有序
// [mid + 1, right] 有序
public void merge(int []a,int left,int mid,int right){
int []tmp=new int[right - left + 1];//辅助数组
int p1=left;
int p2=mid+1;
int k=0;//p1、p2是检测指针,k是存放指针
while(p1<=mid && p2<=right){
if(a[p1]<=a[p2]) {
tmp[k++]=a[p1++];
} else {
tmp[k++]=a[p2++];
}
}
while(p1<=mid) {
tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
}
while(p2<=right) {
tmp[k++]=a[p2++];//同上
}
//复制回原数组
for (int i = right; i >= left; i--) {
a[i]=tmp[k - 1];
k--;
}
}
public static void main(String[] args) {
MyMergeSort mySort = new MyMergeSort();
int[] attr = { 49, 38, 65, 97, 76, 13, 27, 50 };
mySort.sort(attr);
System.out.println("排好序的数组:");
System.out.println(Arrays.toString(attr));
}
}