二分法排序-JAVA

二分法查找是一种在有序数组中查找特定元素的搜索算法,数组可以是增序也可以是减序。
二分法查找的思路如下:

(1) 首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
(2) 如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。直到退出循环(找到退出和没找到退出需要一个flag标记)
二分法查找的时间复杂度O(logn)。
举个简单的例子:
 int [ ] numberArray = new int [ ] {-36,0,1,2,10,18,25,50,59,66,78,80,99,103,257,369,478};//定义一个有序的int数组 0-16 一共17个数
我们需要查找数字18,第一步end = 16 ,head = 0 ,mid = 8; array[8] = 59>18 ,因此要在mid的左边找,所以end = mid - 1 =7 ,所以head = 0,end =7,mid = 3,array[3] = 2 <18 所以在mid的右边。所以head = 3 +1 = 4 ,end =7 ,mid = 5,恰好array[5] = 18所以找到了。这里我们需要注意的是在循环里的条件,也就是退出循环的条件。while(head<=end) 为什么等于也要成立呢,假设我们要找的是66,目前head =8,end = 9, mid =8 ,array[8]=59<60 因此 head = mid +1 = 9 这个时候head = end 如果循环不继续那么显然输出的是没找到,但是实际上是存在的,因此while()一定要是小于等于,这个时候head = 9,end = 9 ,mid = 9 ,array[9] = 66因此就找到了。这里其实还有个小发现,就是我们增序的时候如果没有=丢失的数可能是mid右边那个,因为head + end /2 小数点位被舍弃掉了,因此判断的总是左边的那个,例如这里就是(8 +9) /2 = 8 实际上我们找的66恰好在9。
二分法 JAVA代码:

package com.jyy.java;

public class ArrayTest2 {
	public static void main(String[ ] args) {
	System.out.println("--------------------------------------------------------------------------");
		int [ ] numberArray = new int [ ] {-36,0,1,2,10,18,25,50,59,66,78,80,99,103,257,369,478};//定义一个有序的int数组 0-16 一共17个数
		int head = 0;
		int end = numberArray.length - 1;
		int mid =(head+ end)/2;
		int dts = 18;
		boolean flag2 = true;
		while(head <= end) {
			
			if(numberArray[mid] == dts) {//找到了
				System.out.println("找到了 index:"+mid);
				flag2 = false ;
				break;
			}else if(numberArray[mid]> dts) {//需要找的值在mid的左边
				end = mid -1;
			}else {//numberArray[mid] < dts  需要找的在mid的右边
				head = mid + 1;
			}
			mid =(head+ end)/2;
		}
		
		if(flag2 == true) {
			System.out.println("没找到");
		}
		System.out.println("二分法结束--------------------------------------------------------------------------");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值