一头扎进算法导论-二分法查找

小鱼儿 2022-07-16 10:49 245阅读 0赞

定义:分治算法的另一种体现。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半,递归找,即可。

步骤:
(1)确定该区间的中间位置 mid
(2)将查找的值 valuea[mid] 比较。
若相等,查找成功返回此位置;
否则确定新的查找区域,继续二分查找。
区域确定如下:
value < a[mid] : 新区域为a[start] 至 s[mid-1]
value > a[mid] : 新区域为a[mid+1] 至 s[end]

临界条件: start<=end

时间复杂度:O(log2n)

代码实现:

  1. //根据归并算法,写一个迭代,递归的二分法查找,算法复杂度为log2(n)
  2. public int searchByRecursion(int[] a,int start,int end,int value){
  3. if(end<start){
  4. //临界条件,等于是可以的,临界的数
  5. return -1;
  6. }else{
  7. int mid = (start+end)/2;//求取中间值,奇数为中间值,偶数为中间两个值小的那一个
  8. if(value>a[mid]){
  9. //如果值比中间的值大,那么,开始的坐标移动成为中间值右边的一个数
  10. start = mid+1;
  11. return searchByRecursion(a, start, end, value);
  12. }else if(value<a[mid]){
  13. //如果值比中间的值小,那么,开始的坐标移动成为中间值左边的一个数
  14. end = mid-1;
  15. return searchByRecursion(a, start, end, value);
  16. }else{
  17. return mid;//返回坐标
  18. }
  19. }
  20. }
  21. //非递归模式
  22. public int searchByErgodic(int[] a,int start,int end,int value){
  23. while(end>=start){
  24. //等于号是可取的,表示临界状态
  25. int mid = (start+end)/2;
  26. if(value==a[mid]){
  27. return mid;
  28. }else if(value>a[mid]){
  29. start=mid +1;
  30. }else if(value<a[mid]){
  31. end = mid -1;
  32. }
  33. }
  34. return -1;
  35. }

这里写图片描述

这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一头算法导论-冒泡排序

    定义:交换排序的基本思想是,通过比较两个记录键值的大小,如果这两个记录键值的大小出现逆序,则交换这两个记录,这样将键值较小的记录向序列前部移动,键值较大的记录向序列后部移动。假

    相关 一头算法导论-插入排序

    定义:直接插入排序是一种简单的排序方法,她的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表,就好比斗地主抓牌排序的这么一个过程