5.归并排序
归并的思想理解:
对两个有序的数组, 例如 1,3,5,7 和2,4,6,8,10这样两个数组,可以合并为一个数组
通过遍历两个数组再进行比较,把比较结果依次加入用于存储合并后的临时数组
在具体的实现时,相当于帮一个数组无限划分为两份,直到左右各为一份,此时左右是有序的,排序后合并,
让之后的每次操作都满足左右有序,利用递归去完成归并
package math;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{4,7,2,3,9,13};
new MergeSort().mergesort(arr, 0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public void mergesort(int[] arr , int sta ,int end){
int middle = (sta+end)/2 ;
if(sta<end){
mergesort(arr, sta, middle);
mergesort(arr, middle+1, end);
merge(arr, sta, middle, end);
}
}
//middle两侧数组已经有序
public void merge(int[] arr ,int low , int middle,int high ){
//存储操作后的临时数组
int[] temp = new int[high-low+1];
//第一个数组的开始
int i = low ;
//第二个数组的开始
int j = middle+1 ;
//用于给临时数组加入元素的下标
int index = 0 ;
while(i<=middle&&j<=high){
if(arr[i]>arr[j]){
temp[index++]=arr[j++];
}else{
temp[index++]=arr[i++];
}
}
//此时如果左右两侧的数组长度不一样,则某一侧的剩余也要处理
while(i<=middle){
temp[index++]=arr[i++];
}
while(j<=high){
temp[index++]=arr[j++];
}
//把有序的临时数组给放入原数组
for(int k = 0;k<(high-low+1);k++){
arr[low+k]=temp[k];
}
}
}
关于最后一步把临时数组元素加入原数组不能直接arr=temp ;
应为在递归操作时输入数组长度arr是一定的 ,但我们的temp是对递归的划分大小变化的.