package demo;
import java.util.Arrays;
public class P37 {
//归并排序,重点在于子问题合并
//思路:辅助空间拷贝整个数组,左区开头、右区开头各有一个指针,比较后较小的值放回原数组,对应指针和原数组指针右移。
public static void main(String[] args) {
int[] arr={10,16,4,5,25,13,20};
sort(arr);
System.out.println(Arrays.toString(arr));
}
static int[] helper; //避免重复开辟空间
static void sort(int[] arr) {
helper = new int[arr.length];
mergeSort(arr,0,arr.length-1);
}
static void mergeSort(int[] arr , int s, int e){
if(s<e) {
int mid=s+((e-s)>>1);
mergeSort(arr, s, mid);
mergeSort(arr, mid+1, e);
merge(arr,s,mid,e);
}
}
static void merge(int[] arr , int s,int mid ,int e) {
for(int i=s;i<=e;i++) {
helper[i]=arr[i];
}
int origin=s; //分别指向原数组、左区、右区
int left=s;
int right=mid+1;
while(left<=mid && right<=e) {
if(helper[left]<=helper[right]) {
arr[origin]=helper[left];
origin++;
left++;
}
else {
arr[origin]=helper[right];
origin++;
right++;
}
}
while(left<=mid) { //只有左边剩下要处理
arr[origin]=helper[left];
origin++;
left++;
}
}
}