1. 程式人生 > >安全程式設計(八 . 二)- 有序陣列的實現

安全程式設計(八 . 二)- 有序陣列的實現

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