zoukankan      html  css  js  c++  java
  • 分治法

    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;
        }
    }
  • 相关阅读:
    【Linux 日常】设置动态链接库目录
    某站视频python抓取: m3u8转mp4
    GDB 主要调试命令
    算法【查找一】
    算法【排序四】
    算法【排序三】
    Vim常用命令整理
    【OpenCV】贝叶斯之肤色分割模型
    算法【排序二】
    算法【排序一】
  • 原文地址:https://www.cnblogs.com/tracer-dhy/p/7474903.html
Copyright © 2011-2022 走看看