二分查找算法java实现
前言
提示:以下是本篇文章正文内容,仅供参考
一、二分查找思路
二分查找只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 二分查找法的运行时间为对数时间O(log2 n),即查找到需要的目标位置最多只需要log2 n步,假设从0~99的数列中(n=100)中寻找目标数30,则只需要查找步数log2 100,最多查找7次 二分查找的思路(递归):
-
1、首先确定该数组的中间的下标 mid = (left + right) / 2 2、然后让需要查找的数findVal和arr[mid]比较 2.1 findVal > arr[mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找 2.2 findVal < arr[mid] ,说明你要查找的数在mid的左边,因此需要递归的向左查找 2.3 findVal = arr[mid] ,说明找到,就返回 什么时候结束递归? 找到就结束递归 递归完整个数组,仍然没有找到findVal,也需要结束递归,即当left > right 就需要退出递归
二、代码实现
1.递归实现
代码如下(示例):
package com.yang; /** * 二分查找非递归 * * 二分查找只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 * 二分查找法的运行时间为对数时间O(log2 n),即查找到需要的目标位置最多只需要log2 n步,假设从0~99的数列中(n=100)中寻找目标数30,则只需要查找步数log2 100,最多查找7次 * * 二分查找的思路: * 1、首先确定该数组的中间的下标 * mid = (left + right) / 2 * 2、然后让需要查找的数findVal和arr[mid]比较 * 2.1 findVal > arr[mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找 * 2.2 findVal < arr[mid] ,说明你要查找的数在mid的左边,因此需要递归的向左查找 * 2.3 findVal = arr[mid] ,说明找到,就返回 * * 什么时候结束递归? * 1) 找到就结束递归 * 2) 递归完整个数组,仍然没有找到findVal,也需要结束递归,即当left > right 就需要退出递归 * * @Author: tututuyang * @Date: 2021/6/28 12:41 * @Description: */ public class BinarySearch { public static void main(String[] args) { int[] arr = { 1,4,6,9,10,15,20}; int findVal = 9; System.out.println(binarySearch(arr, 0, arr.length, findVal)); System.out.println(binarySearchNoRecur(arr, findVal)); } /** * @param arr 数组 * @param left 左边的索引 * @param right 右边的索引 * @param findVal 目标数 * @return 如果找到就返回下标,没找到就返回-1 */ public static int binarySearch(int[] arr, int left, int right, int findVal) { if (left > right) { return -1; } int mid = (left + right) / 2; if (arr[mid] == findVal) { return mid; } else if (arr[mid] > findVal) { // 向左边查找 return binarySearch(arr, left, mid - 1, findVal); } else { // 向右边查找 return binarySearch(arr, mid + 1, right, findVal); } } }
2.非递归实现
代码如下(示例):
/** * * @param arr * @param findVal * @return */ public static int binarySearchNoRecur(int[] arr, int findVal) { int left = 0; int right = arr.length - left; while (left <= right) { int mid = (left + right) / 2; if (arr[mid] == findVal) { return mid; } else if (arr[mid] > findVal) { // 向左边查找 right = mid - 1; } else { // 向右边查找 left = mid + 1; } } return -1; }
总结
以上就是今天要记录的内容