二分查找、数组合并


2.4修改orderedArray.java程序(清单2.4)使insert()、delete()与find()方法一样都使用 二分查找,正如书中所建议的那样。
2.5向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数,调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。



public class OrdArray {
    private long[] a;
    private int nElems;

    public OrdArray(int max){
        a = new long[max] ;
        nElems = 0;
    }

    public int size(){
        return nElems;
    }

    public int find(long searchKey){
        int lowerBound = 0;
        int upperBound = nElems-1;
        int curIn;
        while(true){
            curIn = (lowerBound+upperBound)/2;
            if(a[curIn] == searchKey){
                return curIn;//found it
            }
            else if(lowerBound > upperBound){
                return nElems;//can't find it
            }
            else{
                if(a[curIn] < searchKey){
                    lowerBound = curIn+1;
                }
                else{
                    upperBound = curIn-1;
                }
            }
        }
    }

    public void insert(long value){
        int j;
        for(j = 0;j < nElems;j++){
            //find where it goes
            if(a[j] > value){//line search
                break;
            }
        }
        for(int k = nElems;k > j;k--){
            //move bigger ones up
            a[k] = a[k-1];
        }
        a[j] = value;
        nElems++;
    }

    //==========================================================
    //编程作业2.4
    public void insert1(long value){
        if(nElems == 0){
            a[0] = value;
            nElems++;
            return;
        }
        int lowerBound = 0;
        int upperBound = nElems -1;
        int curIn;
        while(true){
            curIn = (lowerBound + upperBound) / 2;
            if(lowerBound > upperBound){
                break;
            }
            if(a[curIn] == value){
                break;//found it
            }
            else if(a[curIn] < value){
                if(curIn == nElems -1){
                    curIn = curIn+1;
                    break;
                }
                else if(a[curIn+1] >= value){
                    curIn = curIn+1;
                    break;
                }
                else{
                    lowerBound = curIn+1;
                }
            }
            else{
                if (curIn == 0) {
                    break;
                }
                else if (a[curIn - 1] <= value) {
                    break;
                }
                else{
                    upperBound = curIn - 1;
                }
            }   
        }
        for(int k = nElems;k > curIn;k--){
            a[k] = a[k-1];
        }
        a[curIn] = value;
        nElems++;   
    }

    //==========================================================
    //编程作业2.4
    public boolean delete(long value){
        int j = find(value);
        if(j == nElems){
            return false;
        }
        else{
            for(int k =j; k < nElems; k++){
                a[k]=a[k+1];
            }
            nElems--;
            return true;
        }
    }

    public void display(){
        for(int j = 0;j < nElems;j++){
            System.out.print(a[j] + " ");
        }
        System.out.println("");
    }

    //=========================================================
    //编程作业2.5
    public OrdArray merge(OrdArray ordArray){
        OrdArray dist = new OrdArray(this.nElems+ordArray.nElems);
        int index = 0;
        for(int i=0;i<ordArray.size();i++){
            dist.insert(ordArray.a[i]);
        }
        for(int i = 0;i < this.size();i++){
            dist.insert(this.a[i]);
        }
        return dist;
    }
}

public class OrderApp {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int maxSize =100;
        OrdArray arr;
        arr = new OrdArray(maxSize);
        arr.insert(77);
        arr.insert(99);
        arr.insert(44);
        arr.insert(55);
        arr.insert(22);
        arr.insert(88);
        arr.insert(11);
        arr.insert(00);
        arr.insert(66);
        arr.insert(33);
        int searchKey = 55;
        if(arr.find(searchKey)!= arr.size()){
            System.out.println("Found  "+searchKey);
        }
        else{
            System.out.println(" Can't find  "+searchKey);
        }

        arr.display();
        arr.delete(00);
        arr.delete(55);
        arr.delete(99);

        arr.display();

        arr = new OrdArray(maxSize);
        arr.insert1(1);
        arr.insert1(2);
        arr.insert1(3);
        arr.insert1(4);
        arr.display();

        System.out.println("第二个数组:");
        OrdArray arr1 = new OrdArray(maxSize);
        arr1.insert(10);
        arr1.insert(20);
        arr1.insert(30);
        arr1.insert(40);
        arr1.insert(50);
        arr1.insert(60);
        arr1.insert(70);
        arr1.display();

        System.out.println("合并两个数组,生成新的数组:");
        OrdArray arr2 = arr.merge(arr1);
        arr2.display();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值