public class Main {
public static void main(String[] args) {
int[] arr = {2,3,1,4,5,0,9,8,7,6};
mergerSort(arr,0,arr.length-1);
for(int i:arr){
System.out.print(i);
}
}
public static void mergerSort(int arr[],int start,int end){
if(start == end){
return;
}
int index = (end+start)/2;//取中间的元素的下标,以下标为分割线,将数组分成两部分
mergerSort(arr,0,index);//递归拆左边的数组
int LeftStart = start; //左边数组的开始
int LeftEnd = index; //左边数组的结束
mergerSort(arr,index+1,end); //递归拆右边的部分
int RightStart = index+1; //右边数组的开始
int RightEnd = end; //右边数组的结束
int left = LeftStart; //未雨绸缪。这里先保存旧数组的开始,把排好序的新数组会赋值给旧数组。
int newArray[] = new int[RightEnd-LeftStart+1]; //定义一个新数组(新数组的长度就是右边数组的结束和左边数组开始之差)
int num=0;//新数组的下标
while(LeftStart <= LeftEnd && RightStart <= RightEnd){ //左边数组开始的下标不能大于左边数组结束的下标,右边同理。
if(arr[LeftStart] > arr[RightStart]) { //已知左边数组和右边数组已经拍好序,所以当左边数组的开始大于右边数组的开始时,由于是升序就将右边数组的开始赋值给新数组。
newArray[num] = arr[RightStart];
RightStart++;
}else{
newArray[num] = arr[LeftStart]; //否则将左边数组的开始赋值给新数组
LeftStart++;
}
num++;
}
//两边数组不一样长时
if(RightStart>RightEnd){ //如果右边数组的开始大于右边数组的结束时,也就是说右边数组已经走完
while(LeftStart<=LeftEnd){ //左边数组开始小于左边数组结束时,(也就是右边数组已经走完,只剩下左边数组时,将剩下的左边数组赋值给新数组)
newArray[num] = arr[LeftStart];
LeftStart++;
num++;
}
}else {
while(RightStart<=RightEnd){ //当右边数组长于左边数组时,将右边数组剩下元素给左边数组
newArray[num] = arr[RightStart];
RightStart++;
num++;
}
}
for(int i =0;i<newArray.length;i++){ //最后将新数组赋值给旧数组。
arr[left] = newArray[i]; //把新数组赋给旧数组
left++; //这里的left是上面保存的旧数组的开始
}
}
}
归并排序
最新推荐文章于 2021-01-25 01:01:53 发布