package althorgrim;
/**
* 1、必须采用顺序存储结果
* 2、关键字必须有序
* @author hanrk-2734
*
*/
public class TestBinarySearch {

public static int binarySearch(int a[],int goal){
int high=a.length-1;
int low=0;
while (low<=high) {
int middle=(low+high)/2;
if (a[middle]==goal) {
return middle;
}
else if (a[middle]>goal) {
high=middle-1;
}
else {
low=middle+1;
}
}
return -1;

}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src, 3));
}

}
O(1):直接寻址到

O(n):遍历n个元素

O(logn):随着元素增加,呈现指数关系

O(n2):增加一倍元素,时间增加4倍

折半查找的算法时间复杂度最好的情况是O(1),平均情况下是logn。

分析一下,折半查找的算法时间复杂度为什么是logn?

算法的时间复杂度取决于运算时间,折半查询中主要依赖while循环次数,那么while循环次数是多少?假设有16个元素的数组进行折半查询,查询元素13

如果是n个元素,那么就是:

可以得出 k=logn


public class Demo {

public static void main(String[] args) {
int[] array = new int[] {3,6,8,9,10,11,13,19,25};
//声明角标 最小 和 最大 角标 和折半角标
int min=0;
int max=array.length-1;
int mid=(max+min)/2;
//声明要查找的值
int key=13;
//循环查找 循环里肯定要折半的操作
//我现在已经 明确知道 循环什么时候停止
//使用 key 和 中间角标的值 比较 如果相等 循环停止

while(key!=array[mid]) {
if(key>array[mid]) {
min=mid+1;
}else if(key<array[max]){
max=mid-1;
}
//重复折半的操作
mid=(max+min)/2;

//如果数组中没有这个数 会造成死循环
//需要一个出口让程序停止
if(min>max) {

//这里说明 没找到这个数 需要停止循环
mid=-1;
break;
}
}System.out.println("坐标是:"+mid);

}

}

最新文章

  1. Orchard学习笔记
  2. silverlighter下MVVM模式中利用Behavior和TargetedTriggerAction实现文本框的一些特效
  3. 无刷新提交表单(非Ajax实现)
  4. Java集合系列:-----------02Collection架构
  5. Objective-C Runtime(转)
  6. ConcurrentDictionary&lt;TKey, TValue&gt;的AddOrUpdate方法
  7. HDU 4614-Vases and Flowers(线段树区间更新)
  8. Codeforces 295C Greg and Friends
  9. Nodejs in Visual Studio Code 07.学习Oracle
  10. javascript中遍历EL表达式List集合中的值
  11. 调用ShellExecute所须要头文件
  12. 《完全用Linux工作》
  13. 关于iOS9 HTTP不能正常使用的解决方法
  14. 关于 Be 主
  15. 【python】带图片验证码的登录自动化实战
  16. ITEXT5.5.8转html为pdf文档解决linux不显示中文问题
  17. webpack始出来
  18. Zabbix3.4监控平台部署
  19. Learning-Python【10】:函数初识
  20. HoloLens开发手记 - 使用混合现实捕捉 Using mixed reality capture

热门文章

  1. [React] Refactor a Stateful List Component to a Functional Component with React PowerPlug
  2. LeetCode 之 Merge Sorted Array(排序)
  3. 纳德拉再造微软:市值如何重回第一阵营(思维确实变了,不再是以windows为中心,拥抱其它各种平台,敢在主战场之外找到适合自己的新战场)
  4. tp5实现多数据库查询
  5. Traversal with a for loop
  6. 集合HashSet的使用
  7. PostgreSQL Replication之第三章 理解即时恢复(2)
  8. Linux 设置交换分区
  9. c#DataGridView复制粘贴删除功能
  10. 在 yii2.0 框架中封装导出html 表格样式 Excel 类