3.二分查找(Java版+增删)

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,再将左面的元素拷贝到新数组中,最后再将右面的元素拷贝到数组中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值