二分查找就是在有序数组的基础上,修改了查找索引的方法
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);
}
}