主要思想为分治算法思想
    分治算法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)
    归并思利用递归树的形式:
    image.png
    递归树,
    image.png

    java代码实现:

    1. public class Merge_SortTest {
    2. public static void main(String[] args) {
    3. int[] a = { 49, 38, 65, 97, 76, 13, 27, 50,1 };
    4. merge_sort c=new merge_sort();
    5. c.mergeSort(a, 0, a.length-1);
    6. System.out.println("排好序的数组:");
    7. for (int e : a)
    8. System.out.print(e+" ");
    9. }
    10. }
    11. class merge_sort{
    12. public merge_sort() {}
    13. //两路归并算法,两个排好序的子序列合并为一个子序列
    14. public void merge(int []a,int left,int mid,int right){
    15. int []tmp=new int[a.length];//辅助数组
    16. int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针
    17. while(p1<=mid && p2<=right){
    18. if(a[p1]<=a[p2])
    19. tmp[k++]=a[p1++];
    20. else
    21. tmp[k++]=a[p2++];
    22. }
    23. while(p1<=mid) tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
    24. while(p2<=right) tmp[k++]=a[p2++];//同上
    25. //复制回原素组
    26. for (int i = left; i <=right; i++)
    27. a[i]=tmp[i];
    28. }
    29. public void mergeSort(int[] a,int start,int end){
    30. if(start<end){//当子序列中只有一个元素时结束递归
    31. int mid=(start+end)/2;//划分子序列
    32. mergeSort(a, start, mid);//对左侧子序列进行递归排序
    33. mergeSort(a, mid+1, end);//对右侧子序列进行递归排序
    34. merge(a, start, mid, end);//合并
    35. }
    36. }
    37. }