安全编程(八 . 二)- 有序数组的实现

1.引言

        有序数组:数组存储有序的元素;

2.实现(暂不考虑重复元素)

        (1).程序主体:

public class OrderArray {
    
    private int[] orderArray;
    private int nElems;  //非空元素个数
    private int initSize; //数组最大容纳元素个数

    public OrderArray(int initSize){
        this.orderArray = new int[initSize];
        this.nElems = 0;
        this.initSize = initSize;
    }

        (2).设计有序数组新元素添加的方法:addElem(int value),思路:

              (2.1)数组已经初始化其内存空间是不能发生改变的,因此数组添加新元素的时候需要考虑数组的存储空间是否有限的问题 ;
              (2.2)新元素有序插入:确定新元素位置–》原数组受影响元素向后移动1位–》存放新元素 ;
              (2.3)更新数组的属性信息:非空元素个数等。

public boolean addElem(int value){

        if(nElems>=initSize){ 
            return false;
        }

        int index = 0; 
        for(int i=0;i<nElems;i++){
            if (value < orderArray[i]){
                index = i;  
                break;
            }
        }
        //最后一个非空元素开始后移1位
        for(int j=nElems-1;j>=index;j--){
            orderArray[j+1] = orderArray[j];
        }
        orderArray[index] = value;
        nElems++;
        return true;
    }

        (3).设计有序数组删除元素方法:delElem(int value) ,思路:

              (3.1)检查原数组是否包含指定值的元素,如果不存在则不处理 ;
              (3.2)有序数组删除元素:确定目标元素位置–》受影响元素前移动1位–》重置原数组最后一个元素值 ;
              (3.3)更新有序数组属性:非空元素个数等 ;
                注意:元素添加的时候已经保证元素的顺序,删除不影响原有的排列顺序。

public  boolean delElem(int value){

        boolean flag = false;
        int index = 0;
        for(int i=0;i<nElems;i++){ 
            if(value == orderArray[i]){
                index = i;
                flag = true;
                break;
            }
        }

        if(!flag)  
            return false;

        for(int i=index;i<nElems-1;i++){  
            orderArray[i] = orderArray[i+1];
        }
        orderArray[nElems-1] = 0;  
        nElems--;
        return true;
    }

        (4).设计有序数组更新元素方法:updateElem(int index,int value) ,思路:

              (4.1)检查设置的元素下表是否越界 

              (4.2)保证更新后的数组的有序:更新指定的元素–》排序

public boolean updateElem(int index,int value){

        if(index>=nElems) 
            return false;

            orderArray[index] = value;
            sortArray(); //重新排序:这里采用冒泡法
            return true;
    }

        (5).冒泡排序法 ,思想:每次排序都将最大或者最小的元素筛选出来放在最后,然后一次对剩下的元素进行最值筛选,最后形成有序的序列 ,sortArray()方法:

public void sortArray(){
        for(int i=0;i<nElems;i++){
            for(int j=0;j<nElems-i-1;j++){
                if(orderArray[j]>orderArray[j+1]){
                    int temp = orderArray[j];
                    orderArray[j] = orderArray[j+1];
                    orderArray[j+1] = temp;
                }
            }
        }
    }

        (6).提供遍历数组元素信息方法:show()

public void show(){
        StringBuffer sb = new StringBuffer();
        sb.append("数组元素:[");
        for(int i=0;i<nElems;i++){
            sb.append(orderArray[i]+",");
        }
        sb.deleteCharAt(sb.length()-1).append("]");
        System.out.println(sb);
    }

        (7).返回数组的非空元素的属性信息:length()

public int length(){
        return nElems;
    }

        (8).程序入口main()

public static void main(String[] args) {
    	OrderArray orderArray = new OrderArray(10);         
        orderArray.addElem(10);
        orderArray.addElem(8);
        orderArray.addElem(9);
        orderArray.addElem(5);
        orderArray.addElem(8);
        orderArray.addElem(7);

        orderArray.show();

        orderArray.delElem(11);
        orderArray.show();

        orderArray.delElem(8);
        orderArray.delElem(9);
        orderArray.show();

        orderArray.updateElem(3,11);
        orderArray.show();

        System.out.println(orderArray.length());
	}

3.结果

数组元素:[5,7,8,8,9,10]
数组元素:[5,7,8,8,9,10]
数组元素:[5,7,8,10]
数组元素:[5,7,8,11]
4

参考文献:https://blog.csdn.net/yang1464657625/article/details/59069809

猜你喜欢

转载自blog.csdn.net/a_cherry_blossoms/article/details/82194492