帝国生成网站地图微信网站开发系统
web/
2025/10/5 7:28:51/
文章来源:
帝国生成网站地图,微信网站开发系统,开发公司与城市资产经营公司合作协议,html模板免费十个网页本文主要梳理了二分查找算法的几种实现思路#xff0c;基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客
1、基本概念
#xff08;1#xff09;前提条件#xff1a;待查找数据必须…本文主要梳理了二分查找算法的几种实现思路基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客
1、基本概念
1前提条件待查找数据必须有序。
2实现方式在查找过程中它先和中间的比较如果等于就直接返回如果小于就在前半部分继续使用二分法进行查找如果大于则在后半部分继续使用二分法进行查找。
2、算法实现
2.1 基本版实现
package com.hh.algorithm.find;public class BinarySearch {public static void main(String[] args) {int[] arr {1,2,4,5,5,6,7,8,9,11,23};System.out.println(BinarySearch.binary(arr, 4));}public static int binary(int[] arr, int key) {int i 0;int j arr.length - 1;while (i j) {int mid (i j) 1;if (key arr[mid]) {j mid - 1;} else if (key arr[mid]) {i mid 1;} else {return mid;}}return -1;}}问题1为什么是 ij 而不是 ij
1ij意味着 ij 它们指向的元素也会参与比较
2ij只意味着mid 指向的元素参与比较。
问题2j - ((j - i) 1) 与 (ij)/2都是相加除2使用后者有没有问题
当超出 int 的范围时他会把最高位视为符号位。 代码实现
package com.hh.algorithm.find;public class BinarySearchTest {public static void main(String[] args) {/*同一个二进制数1011 1111 1111 1111 1111 1111 1111 1110没有超出int 范围默认是不把最高位视为符号位代表3221225470超出int 范围把最高位视为符号位代表-1073741826所以当计算结果超出int的范围时他就会把最高位视为符号位*/int i 0;int j Integer.MAX_VALUE - 1;int mid (j i) / 2;int mid2 (i j) 1;System.out.println(第1轮(j i) / 2 mid);System.out.println(第1轮(ji)/2 mid2);System.out.println(---------------------);i mid1;mid (j i) / 2;mid2 (i j) 1;System.out.println(第2轮(j i) / 2 mid);System.out.println(第2轮(ji)/2 mid2);/*扩展1(j i) / 2还有另一种写法也就是 j - (j - i) / 22j - (j - i) / 2 拆开就是 j - j/2 i/2 -- j/2 i/2 -- (j i) / 2*/}
}
运行结果 2.2 平衡版实现
package com.hh.algorithm.find;
/*// 如果待查找数字一直在左边if那么就会判断比较log(n)次if (key arr[mid]) {j mid - 1;} else if (key arr[mid]) {// 如果待查找数字一直在右边if那么就会判断比较2log(n)次i mid 1;} else {return mid;}解决方式1.左闭右开的区间i指向的可能是目标而j指向的不是目标2.不在循环内找出等范围内只剩i时退出循环在循环外比较 a[i]与target3.循环内的平均比较次数减少了4.时间复杂度 θ(log(n))
*/
public class BinarySearch2 {public static void main(String[] args) {int[] arr {1,2,4,5,5,6,7,8,9,11,23};System.out.println(BinarySearch2.binary(arr, 4));}public static int binary(int[] arr, int key) {int i 0;int j arr.length;while (i 1 j) {int mid (i j) 1;if (key arr[mid]) {j mid;} else{i mid;}}return (key arr[i])? i : -1;}}
运行结果 2.3 java版实现
package com.hh.algorithm.find;/*** 下面是java版本的二分查找代码实现粘贴了底层代码*/
public class BinarySearch3 {public static void main(String[] args) {int[] arr {1,2,4,5,5,6,7,8,9,11,23};System.out.println(BinarySearch3.binarySearch(arr,4));}public static int binarySearch(int[] a, int key) {return binarySearch0(a, 0, a.length, key);}private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {int low fromIndex;int high toIndex - 1;while (low high) {int mid (low high) 1;int midVal a[mid];if (midVal key)low mid 1;else if (midVal key)high mid - 1;elsereturn mid; // key found}//没找到就返回插入点位置return -(low 1); // key not found.}
}
运行结果 2.4 有重复元素的数组返回左右
package com.hh.algorithm.find;/*** 当该数组有重复元素时返回最靠左右的元素位置*/
public class BinarySearchMost {public static void main(String[] args) {int[] arr {1,2,4,5,7,7,7,7,11,23};System.out.println(BinarySearchMost.binaryLeft(arr,7));System.out.println(BinarySearchMost.binaryRight(arr,7));}/*返回最靠左的元素索引*/public static int binaryLeft(int[] arr, int key) {int i 0;int j arr.length - 1;int candidate -1;while (i j) {int mid (i j) 1;if (key arr[mid]) {j mid - 1;} else if (key arr[mid]) {i mid 1;} else {candidate mid;j mid -1;}}return candidate;}/*返回最靠右的元素索引*/public static int binaryRight(int[] arr, int key) {int i 0;int j arr.length - 1;int candidate -1;while (i j) {int mid (i j) 1;if (key arr[mid]) {j mid - 1;} else if (key arr[mid]) {i mid 1;} else {candidate mid;i mid 1;}}return candidate;}
}
运行结果 2.5 没找到返回有意义的值
package com.hh.algorithm.find;/*** 当该数组找不到该元素时返回大于小于等于目标的最靠左右的索引位置*/
public class BinarySearchMost2 {public static void main(String[] args) {int[] arr {1,2,4,5,7,7,7,7,11,23};System.out.println(BinarySearchMost2.binaryLeft(arr,3));System.out.println(BinarySearchMost2.binaryRight(arr,9));}/*返回大于目标的最靠左索引*/public static int binaryLeft(int[] arr, int key) {int i 0;int j arr.length - 1;while (i j) {int mid (i j) 1;if (key arr[mid]) {j mid - 1;} else{i mid 1;}}return i;}/*返回最小于目标的最靠右索引*/public static int binaryRight(int[] arr, int key) {int i 0;int j arr.length - 1;while (i j) {int mid (i j) 1;if (key arr[mid]) {j mid - 1;} else {i mid 1;}}return i-1;}
}
运行结果 本文为学习笔记所参考文章均已附上链接若有疑问请私信
创作不易如果对你有点帮助的话麻烦点个赞支持一下
新手小白欢迎留言指正
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87236.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!