折半查找的递归算法
折半查找也叫二分查找,对有序序列进行搜索,应用于快速排序。
折半查找将数组分为≤mid与>mid左右两个区域,
比较当前数组中间值mid与目标值num的大小,
若num<=mid则在左区域中递归刚才这一过程。
若num>mid则在右区域递归该过程。
由于数组被不断划分为更小部分,总能将数组全部查找完。
二叉查找树的递归算法
二叉查找树又叫二叉搜索树,是完全平衡二叉树和AVL树的母版。
二叉搜索树的结构跟普通二叉树不同,它确保树左子节点<根结点<右子节点,且每个子树也满足上述条件。
因此进行搜索的时候会不断的进行比较,先与根节点做比较,
利用二叉树结构特点设定递归条件,
目标值大于根节点就递归访问根节点的右子节点进行递归查找,
小于根节点就递归访问根节点的左子节点进行递归查找
直到找到目标值
下面是搜索过程的java源代码:
public class Find {
BinarySearchTreeNode Find(BinarySearchTreeNode root, int data){
if(root == null){
return null;
}
if(data < root.getData()){
return Find(root.getLeft(),data);
}
else if(data > root.getData()){
return Find(root.getRight(), data);
}
return root;
}
}
用减治法求解假币问题,算法思想,重点考查三分法
三分法求解假币问题将硬币序列尽可能分为左,中,右三份,
不足的用真硬币补上。
用天平依次称量三份,
当只有一个假币的情况下,必有一组小于另外两组,
再对小于两组的硬币组进行如上递归,。。
如此递归下去,不断的对硬币序列进行partition,最终可求出到底哪个是假币。
求等长升序序列的中位数
找出两个给定有序数组L1和L2的中位数,
假设分别为m1和m2,则会出现下面3种情况
1)如果m1与m2相等,则返回m1
2)如果m1大于m2,取m1左侧,m2右侧的数列按上面方法递归
3)如果m2大于m1,取m1右侧,m2左侧的数列按上面方法递归
重复上述过程
直至两个子数组的大小为1
当最终两个子数组的大小为1时,
若两个值相同则该值为中位数,
若不同则取值小的为中位数
使用分治法实现插入排序
普通插入排序:
下标为1的值num[1]与左侧值num[0]进行比较,如果<num[0]就将其往左挪
--------------------------------------------------------------------------------------------------
下标为2的值num[2]与左侧值num[1]进行比较,如果<num[1]就将其往左挪,
num[1]与左侧值num[0]进行比较,如果<num[0]继续左挪
------------------------------------------------------------------------------------------------
下标为3的值num[3]与左侧值num[2]进行比较,如果<num[2]就将其往左挪,
num[2]与左侧值num[1]进行比较,如果<num[1],继续左挪,
num[1]与左侧num[0]进行比较,如果小于num[0],继续左挪
----------------------------------------------------------------------------------------------------
下标为4。。。。。
如此继续下去,终会让一个有效长度的序列有序。
原理:
普通插入排序的每一次排序都将当前下标之前的序列排成有序序列,通过不断右移下标,
使得有序序列的长度越来越长,直至整个序列有序。
-----------------------------------------------------------------------------
优化:(采用分治法)插入排序(升序):
将下标为1的num[1]存储在temp中,
比较当前位置之前的元素,
>temp的所有元素右移,将temp赋给被挪空的位置,下标值+1,
重复上述过程直至整个序列完全有序。
原理
分治插入排序重复如下过程:每次从输入数据中移除一个元素并将其插入已经排序序列的正确位置,直至所有输入元素都插入有序序列中。通过不断迭代使得整个数组有序。
此过程为典型的就地排序,空间复杂度为O(1),时间复杂度为O(n^2)