分治算法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); //有返回值的话将值返回 }