手写归并排序

package 算法;

public class 归并排序 {

    /**
     *
     * @param arr
     * @param L
     * @param R
     */
    public static void proscss(int[] arr,int L,int R){
        //判断是否可以再分
        if(L>=R){
            return;
        }
        //算出中点
        int mid = L+((R-L)>>1);
        //左边
        proscss(arr,L,mid);
        //右边
        proscss(arr,mid+1,R);
        //合并
        merge(arr,L,mid,R);
    }

    //合并
    public static void merge(int[] arr, int l, int mid, int r){
        //中间数组 帮助排序
        int[] helpArr = new int[r-l+1];
        //移动的点p1 和p2
        int p1 = l;
        int p2 = mid+1;
        int i = 0;
        //放入中间数组 // 用小于等于 因为最后一个数 mid 和 r 也要比
        while (p1<=mid&&p2<=r){
            helpArr[i++] = arr[p1]<=arr[p2] ? arr[p1++]:arr[p2++];
        }
        //l剩下的放入中间数组
        while (p1<=mid){
            helpArr[i++] = arr[p1++];
        }
        //r剩下的放入中间数组
        while (p2<=r){
            helpArr[i++] = arr[p2++];
        }
        //把helpArr放到arr数组
        for (int j = 0; j < helpArr.length; j++) {
            arr[l+j] = helpArr[j];
        }
    }
    public static void main(String[] args) {
        int[] arr =new int[11];
        for (int i = 0; i < 11; i++) {
            arr[i] = (int) ((1000 + 1) * Math.random()) - (int) (1000 * Math.random());
        }
        System.out.println(arr);
        proscss(arr,0, arr.length-1);
        System.out.println(arr);
    }
}

Guess you like

Origin blog.csdn.net/u010191034/article/details/120991056