1.归并排序(Merge Sort)算法完全依照了分治模式
-分解:将n个元素分成n/2个元素的子序列
-解决:将两个子序列递归的排序
-合并:合并两个已经排好序的子序列以得到排序的结果
2.和快排不同的是
-归并的分解较为随意
-重点是合并
package 分治法;
import java.util.Arrays;
public class 归并排序 {
public static void main(String[] args) {
int []arr=new int[]{5,3,2,4,6,7,10};
System.out.println(Arrays.toString(arr));
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void mergeSort(int[] A, int p, int r) {
if(p<r){
int mid=p+((r-p)>>1);
mergeSort(A,p,mid);
mergeSort(A,mid+1,r);
merge(A,p,mid,r);
}
}
private static void merge(int[] A, int p, int mid, int r) {
int[] helper=new int[A.length];
//先把A中的数据拷贝到helper中
System.arraycopy(A,p,helper,p,r-p+1);
int left=p;//左侧队伍的头部指针指向待比较的元素
int right=mid+1;//右侧队伍的头部指针指向待比较的元素
int current=p;//原数组的指针,指向待填入数据的位置
while(left<=mid&r){
if(helper[left]<=helper[right]){
A[current]=helper[left];
current++;
left++;
}else{
A[current]=helper[right];
current++;
right++;
}
}
while(left<=mid){
A[current]=helper[left];
current++;
left++;
}
}
}