1.二分查找算法(非递归)
1.二分查找法只适用于从有序的数列中进行查找(比如数字和字母),将数列排序后再进行查找
2,二分查找法的运行时间为对数时间O(log2 n),即找到查找位置最多只需要log2 n步,
3,数组{1,3,8,10,11,67,100},编程实现二分查找,要求使用非递归的方式完成
public class BinarySearchNoRecur {
public static void main(String[] args) {
int[] arr = {1,3,8,10,11,67,100};
int index = bianrysearch(arr,1);
System.out.println("index=" + index);
}
//二分查找的非递归实现
/**
*
* @param arr 带查找的数组
* @param target 需要查找的数
* @return 返回对应下标,-1表示没有找到
*/
public static int bianrysearch(int[] arr, int target){
int left =0;
int right = arr.length -1;
while (left <= right){
int mid = (left+right)/2;
if (arr[mid] == target){
return mid;
}else if (arr[mid] > target){
right = mid -1;//需要向左边查找
}else {
left = mid +1;//需要向右边查找
}
}
return -1;
}
}
2.分治算法
1.基本步骤:
(1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
(2)解决:若子问题规模较小而容易被解决则直接解决,否则递归的解各个子问题
(3)合并:将各个子问题的解合并为原问题的解
2.汉诺塔
(1)如果是有一个盘,A->C
如果我们有n>=2情况,我们总是可以看作是两个盘 1,最下面的盘;2,上面的盘
(2)先把最上面的盘A->B
(3)把最下面的盘A->C
(4)把B塔的所有盘B->C
public class Hanoitower {
public static void main(String[] args) {
hanoiTower(3,'A','B','C');
}
//汉诺塔的移动的方法
//使用分治算法
public static void hanoiTower(int num, char a,char b, char c){
//如果只有一个盘
if (num == 1){
System.out.println("第1个盘从" + a +"->" +c);
}else {
//如果我们有n>= 2的情况,我们总是可以看作是两个盘1,最下 面的一个盘2,上面的所有盘
//1.先把最上面的所有盘A->B,移动过程会使用到C
hanoiTower(num-1,a,c,b);
//2.把最下面的盘从A->C
System.out.println("第" + num +"个盘从"+ a +"->" +c);
//3.把B塔的所有盘从B->C,移动过程使用到a塔
hanoiTower(num - 1, b, a ,c);
}
}
}