归并排序

归并排序执行流程:

public class MergeSort {
    public static void main(String[] args) {
        int arr[]={2,3,4,0,3,5,15,23};
        mergeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void mergeSort(int []arr,int L,int R)
    {
        if (L==R)
            return;
        int mid=(L+R)/2;
        //处理左边
        mergeSort(arr,L,mid);
        //处理右边
        mergeSort(arr,mid+1,R);
        //归并
        merge(arr,L,mid,R);
    }

    public static void merge(int []arr,int L,int mid,int R)
    {
        //用于存储归并后的临时数组
       int temp[]=new int[R-L+1];
       //记录第一个数组中需要遍历的下标
       int i=L;
       //记录第二个数组中需要遍历的下标
       int j=mid+1;
       //用于记录在临时数组中存放的下标
        int inedx=0;
       //遍历两个数组去除小的放入临时数组
       while (i<=mid&&j<=R)
       {
           temp[inedx++]=arr[i]<arr[j]?arr[i++]:arr[j++];
//           if (arr[i]<=arr[j])
//           {
//               //将小的数放入临时数组
//               temp[inedx]=arr[i];
//               //下标向后移动
//               i++;
//           }else {
//               //将小的数放入临时数组
//               temp[inedx]=arr[j];
//               //下标向后移动
//               j++;
//           }
//           //移动临时数组下标;
//           inedx++;
       }
       //处理第二个数组多余的情况
       while (j<=R)
       {
           temp[inedx++]=arr[j++];
       }
       //处理第一个数组多余的情况
       while (i<=mid)
       {
           temp[inedx++]=arr[i++];
       }
       //将临时数组中的数组重新存入原数组
       for (int k=0;k<temp.length;k++)
       {
           arr[L+k]=temp[k];
       }
    }

}
原文地址:https://www.cnblogs.com/dloading/p/10803856.html