二分查找



二分查找就是在有序数组的基础上,修改了查找索引的方法


public class OperateOrderNoIndexBinarySearch {
 private int[] datas = null;
 private int currentIndex = 0;

 // 通过构造方法设置datas的长度
 public OperateOrderNoIndexBinarySearch(int length) {
  datas = new int[length];
 }

 /**
  * 插入不重复的数据
  *
  * @param data
  */
 public void insert(int data) {
  // 假设为升序
  int i = 0;
  // 1:查找数据data的位置
  for (i = 0; i < currentIndex; i++) {
   if (datas[i] > data) {
    break;
   }
  }

  // 2:把这个位置及其后面的数据,向后移动以为
  for (int index = currentIndex; index > i; index--) {
   datas[index] = datas[index - 1];
  }
  // 3:把data设置到这个位置

  datas[i] = data;
  currentIndex++;
 }

 // 二分查找
 private int binarySearch(int data) {
  int index = -1;
  int lowIndex = 0;
  int highIndex = currentIndex - 1;
  while (true) {
   // 1:找到中间的索引位置
   index = (lowIndex + highIndex) / 2;
   // 2:把要查找的数据和中间的数据进行比较
   if (lowIndex > highIndex) {
    // 没有找到数据
    return -1;
   } else if (datas[index] == data) {
    return index;
   } else {
    if (data < datas[index]) {
     highIndex = index - 1;
    } else {
     lowIndex = index + 1;
    }
   }
  }

 }

 public void remove(int data) {
  // 1:查找这个数据对应的索引
  int index = this.binarySearch(data);

  if (index >= 0) {
   // 2:使用以前的方法
   for (int i = index; i < currentIndex; i++) {
    datas[i] = datas[i + 1];
   }
   currentIndex--;
  }

 }

 public int searchOne(int data) {
  // 1:查找这个数据对应的索引
  int index = this.binarySearch(data);
  if (index >= 0) {
   // 2:如果有,则返回对应的数据
   return datas[index];
  } else {
   // 3:如果没有,则返回0
   return 0;
  }

 }

 public void printDatas() {
  System.out.println("=============>");
  for (int d : datas) {
   System.out.println(d);
  }
 }

 public static void main(String[] args) {
  OperateOrderNoIndexBinarySearch operateNoIndex = new OperateOrderNoIndexBinarySearch(
    10);
  operateNoIndex.insert(1);
  operateNoIndex.insert(8);
  operateNoIndex.insert(6);
  operateNoIndex.insert(2);
  operateNoIndex.insert(3);
  operateNoIndex.printDatas();

  operateNoIndex.remove(3);
  operateNoIndex.printDatas();

  int ret = operateNoIndex.searchOne(2);
  System.out.println(ret);

 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值