1.[L,R]上求最大值
舍弃法
求最大
使用树的方式,将我们要求的因子找出来,减少普通排序的一次次比较
2.递归的master公式---(重点)
一般使用递归是为了职责分明,递归就进栈,弹栈就好了,弹栈是由自己写的条件控制.有多子递归时,那就树来走
本质:二分排序,再合并
开始,进栈[0,7],遇到子,再进栈[0,3],遇到子,再进栈[0,1],再遇到再进,直到遇到该停止的,再不断的弹,弹出这一步,走下一步,下一步再弹,再...
简单没有弹,只是顺序执行的流程
这是一个,没有终止弹栈的流程 原数据:11,8,9,4,12,3,7,6 递归流程:0--1 方法执行:8 11 递归流程:2--3 方法执行:4 9 递归流程:0--3 方法执行:4 8 9 11 递归流程:4--5 方法执行:3 12 递归流程:6--7 方法执行:6 7 递归流程:4--7 方法执行:3 6 7 12 递归流程:0--7 方法执行:3 4 6 7 8 9 11 12 输出结果:3 4 6 7 8 9 11 12
归并排序代码:
public class MergeSortTest { // 解---由大到小解决, // 1.解递归 // 0,R都是数组下标 public void process(int arr[],int L,int R){ if(L==R){ // 结束标志,也就是叶子节点结束 return; } int m = L+((R-L)>>1); process(arr,L,m); //----L----m-----R-- 不仅仅一个,是树 process(arr,m+1,R); /* System.out.println("递归流程"+":"+L + "--" + R);*/ merge(arr,L,m,R); } // 2.解排序--按照最基本的叶子进行计算,满足最基本的LMR的叶子进行思考,如 529 public void merge(int arr[],int L,int M,int R){ // 定:要使得两边有序 --- // 解:最基本的叶子,529--- // 需求:指针,[L,M]边的,[M,R]边的 int p1 = L; int p2 = M+1; // 辅助数组存值 int help[] = new int[R-L+1]; int i = 0; // 辅助的指针 // 节点卡标 while (p1 <= M && p2 <= R){ // 有一个指针满足就停止 help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; // 此时必定会将一边的全打进去 } while (p1 <= M){ help[i++] = arr[p1++]; } while (p2 <= R){ help[i++] = arr[p2++]; } for (int j = 0; j < help.length; j++) { arr[L+j] = help[j]; } /* // merge方法体流程! System.out.print("方法执行:"); for (int i1 : help) { System.out.print(i1+" "); } System.out.println(); */ } public static void main(String[] args) { MergeSortTest mergeSortTest = new MergeSortTest(); int arr[] = new int[]{11,8,9,4,12,3,7,6}; System.out.println("原数据:"+ "11,8,9,4,12,3,7,6"); mergeSortTest.process(arr,0,arr.length-1); System.out.print("输出结果:"); for (int i : arr) { System.out.print(i+" "); } } }