首页 > 其他 > 详细

分治法

时间:2017-09-04 18:45:49      阅读:233      评论:0      收藏:0      [点我收藏+]
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;
    }
}

 

分治法

原文:http://www.cnblogs.com/tracer-dhy/p/7474903.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!