二分查找



二分查找就是在有序數組的基礎上,修改了查找索引的方法


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);

 }
}

發佈了32 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章