分治算法java编码总结

271 阅读1分钟

分治算法java编码总结

一、步骤

先创建一个方法,用来二分数据,以归并排序为例:

  • 方法必须的形参(根据需要再增加别的内容,如查找子数组的范围要传一个存范围的数组):

    • 数组
  • 二分递归方法中的固定流程:

    //所有区间,左闭右开
    public static void sort(int[] arr, int start, int end) {
    	//首先判断当元素个数小于某个数时的操作
        if (end - start == 1) {
        	//在返回之前根据需要做一定的处理
            return;
        }
        //获取中间的位置
        int center = (start + end) / 2;
        //后序遍历
        //对左半边的进行递归二分
        sort(arr, start, center);
        //对右半边的进行递归二分
        sort(arr, center, end);
        //从下往上,进行相应的操作,可以理解为把原问题缩小到只有两个数(左半边一个数,右半边一个数)时候进行的操作
        compose(arr, start, end);
        //这里根据具体情况做更多的处理
    }
    
  • 处理方法中的固定流程:

    public static void compose(int[] arr, int start, int end) {
    	int[] atmp = new int[end - start];
    	//获取中间的位置
        int center = (start + end) / 2;
    	//要改变指针的话对指针作一个备份
        int a = start, b = center, c = end;
    
    	//定义一些记录值(标记值)
        int i = 0;
    	//做相应的处理,如归并中是将左边与右边的数据排序并组合到一起
        while (a < center && b < end) {
            if (arr[a] < arr[b]) {
                atmp[i] = arr[b];
                z += center - a;
                b++;
            } else {
                atmp[i] = arr[a];
                a++;
            }
            i++;
        }
        while (b >= end && a < center) {
            atmp[i] = arr[a];
            a++;
            i++;
        }
        while (a >= center && b < end) {
            atmp[i] = arr[b];
            b++;
            i++;
        }
    
        for (int j = 0; j < atmp.length; j++) {
            arr[start + j] = atmp[j];
        }
        Arrays.toString(arr);
        //有返回值的话将值返回
    }