Java中的Arrays中有一个binarySearch方法,其代码如下:
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
//返回的是待插入的索引的负值
return -(low + 1); // key not found.
}
下面对元素进行增删操作:代码如下:
public class BinarySearchJava {
public static void main(String[] args) {
//1.定义一个数组和一个新数组
int[] arr={3,12,21,30,37,45};
int[] newArr=new int[arr.length+1];
//2.在最右面插入
binarySearchBasicJavaInsert(arr,newArr,46);
//3.在最左面插入
binarySearchBasicJavaInsert(arr,newArr,1);
//4.中间插入
binarySearchBasicJavaInsert(arr,newArr,15);
//5.在最左面删除元素
binarySearchBasicJavaRemove(3);
//6.在最右面删除元素
binarySearchBasicJavaRemove(45);
//7.删除中间元素
binarySearchBasicJavaRemove(21);
}
//插入元素
public static void binarySearchBasicJavaInsert(int[] arr,int[] newArr,int target){
//1.调用java中的二分查找方法
int i = Arrays.binarySearch(arr, target);
//2.java中的二分查找不存在返回的是负值,所以-(i+1)就是不存在的目标值的插入索引
int insertIndex=Math.abs(i+1);
//3.如果要插入的值正好在最左面
if (insertIndex==0){
//3.1让新数组的第一个索引等于目标值
newArr[insertIndex]=target;
//3.2将完整数组拷贝到新数组后面即可
System.arraycopy(arr,insertIndex,newArr,insertIndex+1,arr.length);
//4.如果要插入的值正好在最左面
}else if (insertIndex==arr.length){
//4.1让新数组的最后一个个索引等于目标值
newArr[newArr.length-1]=target;
//4.2将完整数组拷贝到新数组前面即可
System.arraycopy(arr,0,newArr,0,arr.length );
}else {
//5.先将待插入索引前的数组拷贝到新数组中
//从原数组的0索引开始拷贝,拷贝两个元素到新数组中
System.arraycopy(arr,0,newArr,0,insertIndex); //newArr=[3,12,0,0,0,0,0];
//6.将目标值插入到对应索引
newArr[insertIndex]=target; //newArr=[3,12,13,0,0,0,0];
//7.将剩下的元素拷贝到新数组中
//从原数组剩下的开始拷贝,destPos为新数组的开始的索引,length为要拷贝的长度
System.arraycopy(arr,insertIndex,newArr,insertIndex+1, arr.length-insertIndex);//newArr=[3,12,13,21,30,37,45];
}
}
//删除元素
public static void binarySearchBasicJavaRemove(int target){
//1.定义一个数组和一个新数组
int[] arr={3,12,21,30,37,45};
int[] newArr=new int[arr.length-1];
//2.调用java中的二分查找方法
int i = Arrays.binarySearch(arr, target); //i=2
//3.判断元素是否存在
if (i<0){
System.out.println("该元素不存在");
}
//4.删除的元素在最左面
if (i==0){
//4.1只需将第一个元素的的后面元素拷贝到新数组中
System.arraycopy(arr,i+1,newArr,0,newArr.length);
//5.删除的元素在最右面
}else if(i==arr.length-1){
//5.1只需将最后一个元素的的前面元素拷贝到新数组中
System.arraycopy(arr,0,newArr,0,arr.length-1);
}else {
//6.拷贝索引前的位置到新数组中
System.arraycopy(arr,0,newArr,0,i);
//7.将删除的元素值设为0
arr[i]=0;
//6.将剩下的元素拷贝到新数组中
System.arraycopy(arr,i+1,newArr,i,arr.length-i-1);
}
}
}
图3-1
图3-2
给定一个有序数组A和一个新数组B,如图3-1和3-2。
图3-3
假设在最右面插入元素46,如图3-3,只需让新数组最后一个等于插入值,将原数组的所有元素拷贝到新元素前边即可。
图3-4
图3-5
假设插入元素15,先将插入索引前的元素拷贝到新数组中,然后让该插入值等于索引如图3-5所示。
图3-6
最后再将数组剩下的元素拷贝到插入值的后面,如图3-6所示。
图3-7
给定一个有序数组A和新数组C,如图3-1和3-7所示。
图3-8
假设删除最左面的元素,只需将右面的所有元素拷贝到新数组中,如图3-8所示。
图3-9
假设删除最右面的元素,只需将左面的所有元素拷贝到新数组中,如图3-9所示。
图3-10
假设删除的值为21,先将其负值为0,再将左面的元素拷贝到新数组中,最后再将右面的元素拷贝到数组中。