日程表里,都安排了算法学习时间,重要度仅次于英语的学习。但总是在赶项目的时候,就顾不上了。
以至于,把重要的工作往后拖拖拖。要事第一!
算法的学习,以前学过一些,虽然编程中用的不多,但在训练思维和编程功力上是有帮助的。这轮学习,
基本按照:1.复习常见算法及习题;
2.根据《算法导论》,系统学习。
本篇介绍二分查找法:
在一个有序数列中,查找一个数
</pre><pre name="code" class="java">/**
* 在一个有序数列中,查找一个数,有就返回脚标,没有返回-1。
* 方法一,循环
* @param list 一个有序数列中
* @param num 待查的数
* @return 有就返回脚标,没有返回-1
*/
public int searchFor(int[] list,int num) {
if(list==null||list.length<1){
return -1;
}else{
int mid=list.length>>2;
int start=0;
int end=list.length-1;
while(start<=end){
mid=(end+start)>>2;
if(num==list[mid]){
return mid;
}else if(num>list[mid]){
start=mid+1;
}else{
end=mid-1;
}
}
return -1;
}
}
/**
* 方法二:递归查找
* @param list
* @param num
* @param start
* @param end
* @return
*/
public int searchRe(int[] list,int num,int start,int end) {
if(list==null||list.length<1||start>end){//注意,如果end是list.length,这里只需判断start=end就可以
return -1;
}else{
int mid=(start+end)/2;
if(num==list[mid]){
return mid;
}else if(num>list[mid]){
return searchRe(list,num,mid+1,end);
}else{
return searchRe(list,num,start,mid-1);
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
int[] arry=new int[10000];
for (int i = 0; i < 10000; i++) {
arry[i]=i;
}
int t=776;
// int index=new BinarySearch().searchFor(arry, t);
int index=new BinarySearch().searchRe(arry, t,0,arry.length-1);
System.out.println(index);
}
----------------结果--------------------------
776
这个算法适合有序表的频繁查询,不适合增删,算法要注意处理边界值。
参考资料:http://baike.baidu.com/view/610605.htm?fr=aladdin