归并排序:
public static void process(int[]arr,int L,int R){ //归并排序
if(L==R){
return;
}
int mid=L+((R-L)>>1); //用这种方式找到中点
process(arr,L,mid);
process(arr,mid+1,R);
merge(arr,L,mid,R); //是在process后变成单个元素再merge的
}
public static void merge(int arr[],int L,int M,int R){
int []help=new int[R-L+1];
int i=0;
int p1=L;
int p2=M+1;
while(p1<=M&&p2<=R){
help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=M){ //和下面的while执行只能执行一种,因为总有一个p先到终点
help[i++]=arr[p1++];
}
while(p2<=R){
help[i++]=arr[p2++];
}
for(i=0;i<help.length;i++){
arr[L+i]=help[i]; //将help数组中的数拷贝到原数组中
}
}