package datastrucates.arrays.order;
public class OperationArraysDichotomySearch {
private int[] datas = null;
private int currentIndex = 0;
public OperationArraysDichotomySearch(int length) {
datas = new int[length];
}
/**
* 首先的保证数组的数据是有顺序的 当前默认是升序
* @param data
* @return
*/
public int insert(int data) {
// 比较数据大小 找到比传入 数据大的 索引 假设是升序
int index = 0;
for (index = 0; index < currentIndex; index++) {
if (datas[index] > data) {
break;
}
}
// 将大于索引的数据向后移一位
for (int i = currentIndex; i > index; i--) {
datas[i] = datas[i - 1];
}
// 将空出来的位置填充
datas[index] = data;
currentIndex++;
return index;
}
/**
* 二分法查找数字
*
* @param data
* @return
*/
public int dichotomySearch(int data) {
int index = -1;
int lowIndex = 0;
int highIndex = currentIndex - 1;
while (true) {
index = (lowIndex + highIndex) / 2; //每次讲数组一分为二
if (lowIndex > highIndex) {//已经交叉还没有找到,表示数组中不存在
return -1;
} else if (datas[index] == data) {//找到元素
return index;
} else if (datas[index] > data) {//比当前元素大,表示数字大一边向小的一边移动
highIndex = index - 1;
} else {//反之 小的向大的移动
lowIndex = index + 1;
}
}
}
/**
* 查找某个数字
* @param data
* @return
*/
public int selectOne(int data) {
int index=dichotomySearch(data);
if(index>0) {
return index;
}
return -1;
}
public void printDatas() {
System.out.println("+++++++++++++++++++++++");
for(int d:datas) {
System.out.println(d);
}
}
public static void main(String[] args) {
OperationArraysDichotomySearch arrays = new OperationArraysDichotomySearch(10);
arrays.insert(1);
arrays.insert(4);
arrays.insert(3);
arrays.insert(6);
arrays.insert(0);
arrays.printDatas();
int data = arrays.selectOne(5);
System.out.println("returnIndex--->" + data);
}
}
---运行结果 不存在的情况
+++++++++++++++++++++++
0
1
4
4
6
0
0
0
0
0
returnIndex--->-1
--存在的情况
public static void main(String[] args) {
OperationArraysDichotomySearch arrays = new OperationArraysDichotomySearch(10);
arrays.insert(1);
arrays.insert(4);
arrays.insert(3);
arrays.insert(6);
arrays.insert(0);
arrays.printDatas();
int data = arrays.selectOne(1);
System.out.println("returnIndex--->" + data);
}
+++++++++++++++++++++++
0
1
3
4
6
0
0
0
0
0
returnIndex--->1