java中折半查找的原理_java基础-数组的折半查找原理

java基础-数组的折半查找原理

作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回这个元素,如果没有这个元素,就可以返回一个负数。今天我们来介绍一下折半查找的原理,并自己用代码实现折半查找。

一.数组的折半查找原理

二分查找发,也叫折半查找,它的前提就是被查找的数组的元素,必须是有序(本篇博客数据案例均为升序)排列的。

1>.在查找前对数组进行折半操作 (初始化指针位置)

折半公式 =  (最大索引+最小索引)/ 2

首先我们可以利用指针思想,假设有一个指针指向最大值(MAX),有一个指针指向最小值(MIN),还有一个指针指向的是最大值和最小值之间的索引(MID)。我把这个过程称为初始化指针位置。

c9f5f5e7ba87be6ccee2d0bf97ce01f2.png

2>.折半后的指针索引和被查找元素比较。

若被查找元素的值(12)大于中间索引上的值(10),我们就把最小值指针(MIN)移动到中间指针(MID)索引的下一个索引位置,如下图:

0b10f92de42fae14182b8adf752947e7.png

3>.若没有匹配到就继续折半后的指针索引和被查找元素比较。

a05cb179143425e2a676a6d202de1376.png

若被查找元素的值(12)小于中间索引上的值(15),我们就把最大值指针(MAX)移动到中间指针(MID)索引的上一个索引位置,如下图:

c39ea14163808a2ea2c4988c204c1535.png

4>.若没有匹配到就继续折半后的指针索引和被查找元素比较。

若被查找元素的值(12)小于中间索引上的值(13),我们就把最大值指针(MAX)移动到中间指针(MID)索引的上一个索引位置,如下图:

0302c0453addc5df7be0e8d115c01439.png

5>.若没有匹配到就继续折半后的指针索引和被查找元素比较。

当小指针(MIN)的索引(4)超过了大指针(MAX)的索引(3)时,就需要停止查找了,如果真有这种情况发生,说明没有查到被查找元素的值(12),此时会返回一个负数(-1),当然如果查找到了就返回其在数组中的索引即可。

e1ba9149505b2b2c264b0c6e1b7402fa.png

二.数组的折半查找代码实现

1 /*

2 @author :yinzhengjie3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/

4 EMAIL:y1053419035@qq.com5 */

6

7 packagecn.org.yinzhengjie.demo;8

9 public classDemo {10

11 public static voidmain(String[] args) {12 int[] arr = {1,4,7,10,13,15,21,25};13 int index = binarySearch(arr,12);14 System.out.println(index);15 index = binarySearch(arr,7);16 System.out.println(index);17 }18

19 public static int binarySearch(int[] arr,intkey) {20 //定义三个指针变量。

21 int min = 0;22 int max = arr.length - 1;23 int mid = 0;24 //循环折半,条件, min<=max

25 while(min <=max) {26 //公式,计算中间索引

27 mid = (min+max)/2;28 //让被找元素和中间索引元素进行比较

29 if(key>arr[mid]) {30 min = mid +1;31 }else if(key

35 returnmid;36 }37 }38 return -1;39 }40 }41

42

43 /*

44 以上代码执行结果如下:45 -146 247 */

1822a21c9a22a7e3e8357e5d2df43203247.jpg

0bb5ad118aab49506490240e50e6f96ad6f.jpg

1 /*

2 @author :yinzhengjie3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/

4 EMAIL:y1053419035@qq.com5 */

6

7 packagecn.org.yinzhengjie.note;8

9 /*

10 * 二分查找11 * 折半查找12 * 前提:要找的数组必须是有序的.13 * 每次都用中间的元素和要找的元素进行比较14 *15 */

16 public classBinarySearchDemo {17

18 public static voidmain(String[] args) {19 int[] arr = {1,4,7,10,13,15,21,25};20 int index = binarySearch(arr,21);21 //对返回值进行判断

22 if(index == -1){23 System.out.println("no such element");24 }else{25 System.out.println("index is : " +index);26 }27 }28

29

30 //自定义方法,折半查找

31 public static int binarySearch(int[] arr,intvalue){32 int min = 0;33 int max = arr.length - 1;34 int mid = (min + max) / 2;35 while(true){36 //判断要找的数落在左边还是右边

37 if(value >arr[mid]){38 min = mid + 1;39 }else if(value

45 mid = (min + max) / 2;46 //没有找到的条件判断

47 if(min >max){48 return -1;49 }50 }51 }52 }53

54

55 /*

56 以上代码执行结果如下:57 index is : 658 */

另一种二分法查找的实现方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值