2.5递归地进行插入排序
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr=new int[]{1,3,7,4,33,12,11,33};
insertsort(arr, arr.length-1);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
public static void insertsort(int[] arr,int k) {
if(k==0) {
return;
}//找出口
insertsort(arr, k-1); //小规模,前k-1个 找变化
//找参数:最后一个元素位置
int x=arr[k];//最后一个元素,小了就插在前面位置
int index=k-1;
while(index>-1&&x<arr[index]) {
arr[index+1]=arr[index];
index--;
}
arr[index+1]=x;
}
总结:
找重复(都是父问题转化到求子问题)
1.找到一种划分方法
2.找到递推公式或者等价转换
找变化的量
变化的量通常作为参数
找出口
结束条件
2.6汉诺塔
思路:
1-N从A移动到B,C为辅助
等价于:
1.1-N-1从A移动到C,B是辅助
2.把N从A移动到B
3.1-N-1从C移动到B,A是辅助
用到了树里的中序遍历。。。
public static void main(String[] args) {
// TODO Auto-generated method stub
tower(3, "A", "B", "C");
}
/**
*
* @param N 最下面的数
* @param from 原始柱子
* @param to 目标柱子
* @param help 辅助柱子
*/
public static void tower(int N,String from,String to,String help) {
if(N==1) {
System.out.println("move "+N+" from "+from+" to "+to);
return;
}
tower(N-1, from, help, to);
System.out.println("move "+N+" from "+from+" to "+to);
tower(N-1, help, to, from);
}