又来算法了~~~~
在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
这时候你想到到什么呢??????
猜数游戏 ,你是怎么猜数的呢?
哈哈哈哈~
此刻于是王五开始答复了,从1开始猜,一直直到结束,这样最好了!!!!
聪明的张三此刻想到,该怎么猜数才能猜的最快呢????
接下来,就会想到,假设在给定范围的中间进行猜测,每次根据得到的值进行判断在中间猜,这样会不会提高效率呢?
接下来演示一下猜数游戏:
我已经想好了一个1-100之间的数了。
请输入一个1到100之间的数:50
你猜的数大了。请输入一个1到100之间的数:25
你猜的数小了。请输入一个1到100之间的数:35
你猜的数小了。请输入一个1到100之间的数:44
你猜的数大了。请输入一个1到100之间的数:40
你猜的数大了。请输入一个1到100之间的数:38
你猜的数小了。请输入一个1到100之间的数:39
你猜的数小了。太好了,你用了7次就猜到了答案。
如果是让你猜这个数,你会怎么猜呢?
这个刚才所演示的便是二分思想完成猜数游戏的,在这里,我相信大家对二分算法的实现原理已经了然于胸了;但是还的继续,你越爱它,它便会越爱你!!!
二分法时针对于已经排序的数组
package mazi;
public class BinarySearch {
public static int binarySearch(int[] arr, int start, int end, int hkey){
int result = -1;
// 进行二分查找
while (start <= end){
int mid = start + (end - start)/2; //防止溢位
if (arr[mid] > hkey)
// 让下标从中间向左
end = mid - 1;
else if (arr[mid] < hkey)
// 让起始下标右移动
start = mid + 1;
else {
result = mid ;
break;
}
}
return result;
}
public static void main(String[] args) {
int [] arr = {1,2,3,4,5,6,7,8,9,10};
int res = binarySearch(arr,0,arr.length-1,10);
System.out.println("res="+res);
}
}
{1,2,3,4,5,6,7,8,9,10};
初下标(左侧的起始下标) + (末下标 - 初下标) / 2
第一轮 mid=4 start=0 end=9 mid = 0 + ( 9 - 0)/2;
第二轮 mid=7 start=5 end=9 mid = 5 + ( 9- 5) /2;
第三轮 mid=8 start=8 end=9 mid = 8 + (9 - 8 ) /2;
第四轮 mid=9 start=9 end=9 mid = 9 + (9 - 9) /2;
感谢阅读,欢迎大家留言~~~