package 算法;
public class 归并排序 {
/**
*
* @param arr
* @param L
* @param R
*/
public static void proscss(int[] arr,int L,int R){
//判断是否可以再分
if(L>=R){
return;
}
//算出中点
int mid = L+((R-L)>>1);
//左边
proscss(arr,L,mid);
//右边
proscss(arr,mid+1,R);
//合并
merge(arr,L,mid,R);
}
//合并
public static void merge(int[] arr, int l, int mid, int r){
//中间数组 帮助排序
int[] helpArr = new int[r-l+1];
//移动的点p1 和p2
int p1 = l;
int p2 = mid+1;
int i = 0;
//放入中间数组 // 用小于等于 因为最后一个数 mid 和 r 也要比
while (p1<=mid&&p2<=r){
helpArr[i++] = arr[p1]<=arr[p2] ? arr[p1++]:arr[p2++];
}
//l剩下的放入中间数组
while (p1<=mid){
helpArr[i++] = arr[p1++];
}
//r剩下的放入中间数组
while (p2<=r){
helpArr[i++] = arr[p2++];
}
//把helpArr放到arr数组
for (int j = 0; j < helpArr.length; j++) {
arr[l+j] = helpArr[j];
}
}
public static void main(String[] args) {
int[] arr =new int[11];
for (int i = 0; i < 11; i++) {
arr[i] = (int) ((1000 + 1) * Math.random()) - (int) (1000 * Math.random());
}
System.out.println(arr);
proscss(arr,0, arr.length-1);
System.out.println(arr);
}
}
06-01
232
09-20
1122