当前位置:   article > 正文

【java算法】二分查找算法详解_java二分法查找算法

java二分法查找算法

hello,大家好!我是磨磨唧唧小蘑菇~

最近在努力的复习一些基本的算法,本期就以java的二分查找算法进行详细的概述(之前面试的时候,手写算法被坑过,一把泪啊)。进入正题吧~

目录

一、二分查找算法的介绍

二、二分查找算法的思路分析

三、二分查找算法的实例

一、二分查找算法的介绍

二分查找,又名折半查找。顾名思义,一半一半去找目标值~

对于一个有序的升序列表,将目标值与表中间的值进行对比:

1)如果目标值与表中间的值相等,则直接返回表中间的值即可

2)如果目标值与表中间的值不相等,则将两者进行大小比较,从而分成两个表:

(1)如果目标值小于中间值,说明目标值在中间值往左的表中,故舍弃中间值往右的表,重新二分查找中间值往左的表

(2)如果目标值大于中间值,说明目标值在中间值往右的表中,故舍弃中间值往左的表,重新二分查找中间值往右的表

最后,重复以上过程,直到找到目标值为止;或直到子表不存在为止,此时为查找不成功

二、二分查找算法的思路分析

1)首先确定有序的升序列表的中间值是多少

即:mid = (left+right)/2        //中间值的下标

2)将目标值target与表中间的值arr[mid]进行比较:

即:如果target = arr[mid],说明目标值与arr[mid]相等,找到了目标值

       如果target < arr[mid],说明目标值在arr[mid]的左边,因此需要接着二分查找左边的表

       如果target > arr[mid],说明目标值在arr[mid]的右边,因此需要接着二分查找右边的表

Attention:什么时候需要结束呢?

1)找到目标值就结束

2)查找完整个数组,如果依然没有找到目标值,也需要结束

3)当left > right,则直接退出

三、二分查找算法的实例

eg:给你一个有序的升序数组,再给你一个目标值,请在数组中找到对应的目标值并返回它的下标

1、非递归算法实现:

  1. package com.java.basic.array;
  2. /**
  3. * @Author wangchuanmin
  4. * @Date 2021/9/1 17:35
  5. */
  6. import java.util.Arrays;
  7. /**
  8. * 二分查找算法
  9. */
  10. public class BinarySearch {
  11. /**
  12. * 二分查找算法第一种:有序数组中没有重复的目标值(目标值是唯一的)---非递归
  13. * @param target
  14. * @param nums
  15. * @return
  16. */
  17. // 非递归实现
  18. public int binarySearch1(int target, int[] nums) {
  19. int left = 0;
  20. int right = nums.length-1; //取最后一个下标
  21. int mid = 0;
  22. if (left > right || nums.length == 0 || nums == null) { //左下标大于右下标,直接返回-1
  23. return -1;
  24. }
  25. while (left <= right) { //初始化 right 的赋值是 nums.length - 1,即最后一个元素的索引,而不是 nums.length
  26. mid = (left + right)/2; //如果下标之和除以2有小数,则直接去掉0.5
  27. if (target == nums[mid]) {
  28. return mid; //找到目标值,然后返回
  29. } else if (target > nums[mid]) { //目标值大于中间值,向右遍历
  30. left = mid + 1; //所以向右遍历的第一个下标是:中间下标+1
  31. } else if (target < nums[mid]) { //目标值小于中间值,向左遍历
  32. right = mid - 1; //所以向左遍历的最后一个下标是:中间下标-1
  33. }
  34. }
  35. return -1; //找不到对应目标值,直接返回-1
  36. }
  37. public static void main(String[] args) {
  38. BinarySearch bSearch = new BinarySearch();
  39. int target = 9;
  40. int[] nums = new int[]{9,3,4,6,8};
  41. Arrays.sort(nums);
  42. System.out.println("排序后的nums为:" + Arrays.toString(nums));
  43. int result = bSearch.binarySearch1(target,nuns);
  44. System.out.println("非递归算法,目标" + target + "的下标是:" + result);
  45. }
  46. }

运行结果如下:

  1. 排序后的nums为:[3, 4, 6, 8, 9]
  2. 非递归算法,目标9的下标是:4
  3. Process finished with exit code 0

2、递归算法实现:

  1. package com.java.basic.array;
  2. /**
  3. * @Author wangchuanmin
  4. * @Date 2021/9/1 17:35
  5. */
  6. import java.util.Arrays;
  7. /**
  8. * 二分查找算法
  9. */
  10. public class BinarySearch {
  11. /**
  12. * 二分查找算法第二种:有序数组中没有重复的目标值(目标值是唯一的)---递归
  13. * @param target
  14. * @param nums
  15. * @param left
  16. * @param right
  17. * @return
  18. */
  19. public int binarySearch2(int target, int[] nums, int left, int right) {
  20. int mid = (left + right)/2;
  21. if (nums.length == 0 || nums == null || left > right) {
  22. return -1;
  23. }
  24. while (left <= right) {
  25. if (target == nums[mid]) {
  26. return mid;
  27. } else if (target < nums[mid]) {
  28. return binarySearch2(target, nums, left, mid - 1);
  29. } else if (target > nums[mid]) {
  30. return binarySearch2(target, nums, mid + 1, right);
  31. }
  32. }
  33. return -1;
  34. }
  35. public static void main(String[] args) {
  36. BinarySearch bSearch = new BinarySearch();
  37. int target = 8;
  38. int[] nums = new int[]{9,3,4,6,8};
  39. Arrays.sort(nums);
  40. System.out.println("排序后的nums为:" + Arrays.toString(nums));
  41. int result1 = bSearch.binarySearch2(target, nums, 0, nums.length-1 );
  42. System.out.println("递归算法,目标" + target + "的下标是:" + result1);
  43. }
  44. }

运行结果如下:

  1. 排序后的nums为:[3, 4, 6, 8, 9]
  2. 递归算法,目标8的下标是:3
  3. Process finished with exit code 0

以上的两种方法,仅适用于“目标值是唯一”。如果相同目标值有多个的话,就不适用啦~(目前还没想明白,如果有多个目标值的时候,该怎么办?)哎,真是苦恼呢QAQ

好啦,到这里java的二分查找算法就结束啦~欢迎交流;-)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/502572
推荐阅读
相关标签
  

闽ICP备14008679号