/*
* 1、将待排序的数组进行分割,分为两部分,对两部分进行排序,再向下递归。
* 2、将分成的两部分再次分割,直到只剩下一个元素。
* 3、此时结束递归向上返回,退出最后一层递归后,将将倒数第二层分割的两部分合并在一起,
* 之后,依次将各层递归分割开的部分合并,最终合并出有序数组
* 4、合并方法是归并排序的核心部分,
* 1)首先计算当前需要合并的的两个数组的总长度,定义一个temp数组保存合并起来的元素。
* 2)对分割开的两个数组(其实是一个数组,通过控制下标将数组分割)进行循环,同时从两个数组中取出
* 一个元素,比较大小,将小的一个保存到temp数组中,同时将temp的下标指针和取出当前元素的数组的下
* 标指针加一。
* 3)循环结束后进行判断,如果还有一个数组有剩余元素,则将此数组追加到temp数组后,生成的temp数组
* 就是有序的两个分割数组的合并。
* 4)将temp数组保存到原数组中。一次归并结束。
*/
package 归并;
public class Demo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] arr = {1,4,3,5,7,2,9,8,10};
sort(arr,0,arr.length-1);
for(int a:arr) {
System.out.println(a);
}
}
public static void sort(int[] arr,int l_index,int r_index) {
int mid_index = (l_index+r_index)/2;
if(l_index<r_index) {
sort(arr,l_index,mid_index);
sort(arr,mid_index+1,r_index);
merge(arr,l_index,mid_index,r_index);
}
}
public static void merge(int[] arr,int l_index,int mid_index,int r_index) {
int[] temp = new int[r_index-l_index+1];
int i=l_index,j=mid_index+1,index=0;
while(i<=mid_index&&j<=r_index) {
if(arr[i]>arr[j]) {
temp[index++] = arr[j++];
}else {
temp[index++] = arr[i++];
}
}
if(i<=mid_index) {
for(;i<=mid_index;i++) {
temp[index] = arr[i];
index++;
}
}
if(j<=r_index) {
for(;j<=r_index;j++) {
temp[index] = arr[j];
index++;
}
}
index = 0;
for(int k=l_index;k<=r_index;k++) {
arr[k] = temp[index];
index++;
}
}
}