Java数据结构与算法笔记——无序数组和有序数组

无序数组和有序数组比较

无序数组

增:在数组最后插入
删:找到元素;改为null;后面的元素逐一前移
查:从第一项元素开始遍历,直至找到该元素或者遍历结束

特点

效率:插入数据快,查找数据慢,删除数据慢
扩展性差:一旦创建后,大小就固定了,不能动态扩展数组元素的个数,有可能造成空间浪费或者空间不足。

有序数组

插入:找到插入元素应该插入的位置(根据元素值的大小);将该位置以及以后的全部数据项向后移动一位;在该位置插入元素
删除:找到要删除的元素;后面的所有元素向前移位
查找:遍历查找or二分查找

特点

效率:插入数据慢,查找数据快(二分查找),删除数据慢。
扩展性差:一旦创建后,大小就固定了,不能动态扩展数组元素的个数,有可能造成空间浪费或者空间不足。

代码实现自己的数组

无序数组

package demo;

public class unorderedArray {
    //程序的执行入口
    public static void main(String[] args){
        ArrayClass arrayClass = new ArrayClass(100);

        //新增元素
        arrayClass.insert(11);
        arrayClass.insert(23);
        arrayClass.insert(45);
        arrayClass.insert(21);
        arrayClass.insert(66);
        arrayClass.insert(77);
        arrayClass.insert(66);

        //显示新增的数据
        arrayClass.display();

        //删除数据77
        arrayClass.delete(23);

        //显示新增的数据
        arrayClass.display();

        //查找
        System.out.println(arrayClass.find(11));
        System.out.println(arrayClass.find(1));

        //修改
        arrayClass.modifyFirst(66,77);

        //显示新增的数据
        arrayClass.display();

        //修改
        arrayClass.modifyAll(77,100);

        //显示新增的数据
        arrayClass.display();

    }
}

/**
 * 创建一个封装数组的类
 */

class ArrayClass{
    private long[] arr; //被封装的数组
    private int nElems; //数组中存在的元素的个数,当前的数组长度

    //通过类的构造方法初始化
    public ArrayClass(int maxSize){ //数组的最大长度
        arr = new long[maxSize]; //初始化被封装的数组
        nElems = 0;
    }

    //新增数据项,数组元素
    public void insert(long data){
        arr[nElems] = data;
        nElems ++;
    }

    //查找某一特定的数据项
    //找到返回true,否则返回false
    public boolean find(long searchData){
        int i;
        for (i=0;i<nElems;i++){
            if(searchData == arr[i]){
                break;//找到了就直接终止循环,此时i不再++,就等于对应元素的索引值
            }
        }
        if(i == nElems){
            return false;
        }
        else{
            return true;
        }
    }

    //删除指定的数据项
    public void delete(long targetDate){
        //首先找到要删除的数据
        int i;
        for (i=0;i<nElems;i++){
            if(targetDate == arr[i]){
                break;//找到了就直接终止循环,此时i不再++,就等于对应元素的索引值
            }
        }
        if(i == nElems){
            System.out.println("没有找到要删除的数据");
        }
        else{
            for(int j =i;j<nElems;j++){
                arr[j] = arr[j+1]; //删除数组中要删除的元素
            }
            nElems --; //数组长度-1
        }
    }

    //遍历数据结构中的各个数据项
    public void display(){
        for(int i=0;i<nElems;i++){
            System.out.print(arr[i] + "  ");
        }
        System.out.println();//加一个换行符
    }

    /**
     * 以下内容是自己加的
     */
    //修改数组内容(全部相同内容都改)
    public void modifyAll(long originalData, long targetData){
        for(int i=0;i<nElems;i++){
            if(arr[i]==originalData){
                arr[i] = targetData;
            }
        }
    }

    //修改数组内容(全部相同内容都改)
    public void modifyFirst(long originalData, long targetData){
        for(int i=0;i<nElems;i++){
            if(arr[i]==originalData){
                arr[i] = targetData;
                break;
            }
        }
    }
}

有序数组

package demo;

public class OrderedArray {
    //程序的执行入口
    public static void main(String[] args){

        OrderArray orderArray = new OrderArray(100);
        orderArray.insert(15);
        orderArray.insert(44);
        orderArray.insert(55);
        orderArray.insert(22);
        orderArray.insert(1);
        orderArray.insert(99);

        orderArray.display();

        System.out.println(orderArray.find(55));

        orderArray.delete(22);

        orderArray.display();
    }
}


/**
 *封装有序数组
 */
class OrderArray{
    private long[] arr;
    private int nElems;

    //构造方法
    public OrderArray(int maxSize){
        arr = new long[maxSize];
        nElems =0;
    }

    //插入新的数据项
    public void insert(long data){
        //找到插入数据的位置
        int i;
        for(i=0;i<nElems;i++){
            if(arr[i]> data){
                break;
            }
        }

        //判断找没找到
        if(i<nElems){//找到了插入位置
            for(int j=nElems;j>i;j--){
                if(j<arr.length){//判断数组是否还有空间
                    arr[j]=arr[j-1];
                }
            }
            arr[i] = data;
            nElems ++;
        }
        else{//没找到,,要插入的元素比数组中其他元素都大
            if(nElems<arr.length){//还有位置
                arr[nElems] = data;
                nElems ++;
            }
        }
    }

    //遍历数组
    public void display(){
        for(int i=0;i<nElems;i++){
            System.out.print(arr[i]+"  ");
        }
        System.out.println();
    }

    //查找(二分查找)
    //找到了就返回数组在数组中的索引值,没找到就返回数组的当前长度
    public int find(long searchData){
        int lowerBound = 0;
        int upperBound = nElems-1;
        int curint; // 对数组进行二分的时候,中间元素对应的索引值

        while(true){
            curint = (lowerBound + upperBound) / 2; //自动取整
            if(arr[curint] == searchData){
                return curint; //return不仅会结束while循环,还会结束find方法
            }else if(lowerBound>upperBound) {
                //数组中没有要查找的元素
                return nElems;
            }else{
                if(arr[curint] > searchData){
                    upperBound = curint-1;
                }else{
                    lowerBound = curint+1;
                }
            }
        }
    }

    //删除指定元素
    public void delete(long data){
        int i = find(data);
        if(i<nElems){//数据纯在
            for(int j = i;j<nElems;j++){
                arr[j] = arr[j+1];
            }
            nElems --;
        }
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值