Java基础-算法-二分查找法

159 阅读1分钟

package Java基础04_一维数组;
//二分查找算法
//真,二分查找法,需要先排序
/*二分算法步骤描述
① 首先确定整个查找区间的中间位置 mid = ( left + right )/ 2
② 用待查关键字值与中间位置的关键字值进行比较;
若相等,则查找成功
若大于,则在后(右)半个区域继续进行折半查找
若小于,则在前(左)半个区域继续进行折半查找
③ 对确定的缩小区域再按折半公式,重复上述步骤。
最后,得到结果:要么查找成功, 要么查找失败。折半查找的存储结构采用一维数组存放。 折半查找算法举例
 */
public class ErFenArrayDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arry = {2,3,5,12,6,24,74,67,5,11,22,54,28,28,9,19,10};
		for(int i = 0;i<arry.length-1;i++) {
			for(int j=0;j<arry.length-1;j++) {
				if(arry[j]>arry[j+1]) {
					int linshi = arry[j];
					arry[j]=arry[j+1];
					arry[j+1]=linshi;
				}
			}
		}
		for(int i=0;i<arry.length-1;i++) {
			System.out.print(arry[i]+",");	//从小到大输出2,3,5,5,6,9,10,11,12,19,22,24,28,28,54,67,
		}
		System.out.println();
		int findNume=22;//要查找的数
		int start = 0;
		int end=arry.length-1;
		System.out.println("end"+end);//16
		int findIndex=-1;
		int middle=0;
		while(start<=end) {//0<16,9<16
			System.out.println("start1:"+start);//0,9
			middle=(start+end)/2;//取中间的值的索引值8,12
			System.out.println("middle:::"+middle);
			if(findNume>arry[middle]) {//22大于11,22<24
				//如果要查询的数大于中间值,则开始值转换成等于中间值的索引值加一,继续往大的数查询。
				start=middle+1;//star=9,
				System.out.println("start2:"+start);
			}
			if(findNume<arry[middle]) {
				//如果要查询的数小于中间值,则开始值转换成等于中间值的索引值加一,继续往小的数查询查询。
				end=middle-1;
			//	System.out.println(end);
			}
			if(findNume==arry[middle]) {
				//如果要查询的数等于中间值,则直接查询到了。
				findIndex=middle;
			//	System.out.println(findIndex);
				break;
			}
		}
		if(findIndex==-1) {
			System.out.println("没有找到");
		}else {
			System.out.println("已经找到:"+arry[findIndex]);
		}
	}

}