分治法

package alg;

import java.util.Arrays;

/**
 * 分治法
 * Created by dinghaiyun on 2017/9/4.
 */
public class DivideAndConquer {
    public static void main(String[] args) {

        int[] arr = new int[]{5, 2, 4, 7, 1, 3, 2, 6};

        mergeSort(arr, 0, arr.length - 1);

        System.out.println(" divide and conquer result:  " + Arrays.toString(arr));

    }

    private static void mergeSort(int[] arr, int p, int r) {
        if (p < r) {
            int q = (p + r) / 2;

            mergeSort(arr, p, q);

            mergeSort(arr, q + 1, r);

            merge(arr, p, q, r);

            System.out.println("mereResult : " + Arrays.toString(arr));
        }

    }

    private static int[] merge(int[] arr, int p, int q, int r) {
        int leftLen = q - p + 1;
        int rightLen = r - (q + 1) + 1;
        int[] arrLeft = new int[leftLen];
        int[] arrRight = new int[rightLen];
        for (int i = p; i <= q; i++) {
            arrLeft[i - p] = arr[i];
        }
        for (int i = q + 1; i <= r; i++) {
            arrRight[i - (q + 1)] = arr[i];
        }

        System.out.println("left:" + Arrays.toString(arrLeft) + ", right:" + Arrays.toString(arrRight));
        int i = 0, j = 0;
        int index = p;
        while (i < leftLen && j < rightLen) {
            if (arrLeft[i] < arrRight[j]) {
                arr[index] = arrLeft[i];
                i++;
            } else if (arrLeft[i] > arrRight[j]) {
                arr[index] = arrRight[j];
                j++;
            } else {
                arr[index] = arrLeft[i];
                arr[index + 1] = arrRight[j];
                i++;
                j++;
                index++;
            }
            index++;
        }

        int increasement = 0;
        if (i != leftLen) {
            for (; i < leftLen; i++) {
                arr[index + increasement] = arrLeft[i];
                increasement++;
            }

        } else {
            for (; j < rightLen; j++) {
                arr[index + increasement] = arrRight[j];
                increasement++;
            }
        }
        return arr;
    }
}
原文地址:https://www.cnblogs.com/tracer-dhy/p/7474903.html