二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了。为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62。直到猜中她所给的数。
下面给出我们猜1-100的数,key为33的过程:
只需7次就可以猜中答案。下面我们给出二分查找的代码:
public class BinarySearch { private long[] a; private int nelems; public BinarySearch(int max){ a = new long[max]; nelems = 0; } //返回数组的长度 public int size(){ return nelems; } /** * 二分查找算法关键代码 * @return */ public int binarySearch(long searchKey){ int low = 0; int high = nelems-1; int curIn; while(true){ curIn = (low + high)/2;//划分范围的点 if(a[curIn] == searchKey){//幸运判断,很幸运正好猜中 return curIn; //返回要猜的数的位置 }else if(low > high){//范围不存在 return nelems;//没找到,返回数组的长度 }else{ if(searchKey > a[curIn]){ low = curIn + 1; }else{ high = curIn - 1; } } } } /** * * 在有序数组里面插入数 * @param args */ public void insertOrderArray(long value){ int i; for(i=0;i<nelems;i++){//遍历有序数组里面的元素与插入的数进行比较 if(a[i] > value){//如果有序数组里面的某一个数比插入的数大,则结束遍历 break; } } //插入的位置i,及i后面到的元素都要向右移动,腾出一个插入位置 for(int k=nelems;k>i;k--){ a[k] = a[k-1];//a[10]=a[9],a[9] = a[8]插入点后面的都向右移动一个位置 } a[i] = value;//移动后腾出位置插入要插入的数 nelems++; } /** * 删除有序数组里面的数 */ public boolean delete(long key){ int i = binarySearch(key);//返回找到的数字数组下标 if(i==nelems){ return false; }else{ int j; for(j=i;j<nelems;j++){ a[j] = a[j+1];//向前移动 } nelems--;//数组长度减少 return true; } } /** * 显示数组中的数 */ public void display(){ System.out.println("***************"); for(int j=0;j<nelems;j++){ System.out.print(a[j]+" "); System.out.print(""); } } public static void main(String[] args){ int maxSize = 100; BinarySearch arr = new BinarySearch(maxSize); arr.insertOrderArray(30); arr.insertOrderArray(12); arr.insertOrderArray(15); arr.insertOrderArray(10); arr.insertOrderArray(90); arr.insertOrderArray(100); arr.insertOrderArray(101); arr.insertOrderArray(80); System.out.println("##############"); arr.display(); long keySearch = 102; if(arr.binarySearch(keySearch) != arr.size()){//上面返回值为没找到返回nelems长度 System.out.println("找到"+keySearch); }else{ System.out.println("没有找到"+keySearch); } arr.delete(30); arr.delete(100); arr.display(); } }
java数据结构学习(一)之二分查找
时间: 2024-10-05 04:58:30