算法 中的 數組

數組(Array)是有限個相同類型的變量所組成的集合,數組中的每一個變量被稱爲元素,且每一個元素都有自己的下標,從0開始,到 array.length() -1 結束。

數組在內存中是順序存儲的,數組的每一個元素都存儲在每一個存儲單元中,並且元素元素之間緊密排列,既不打亂元素的存儲順序,也不跳過某個元素單元進行存儲。

 

讀取元素

隨機讀取,比如取array下標爲n的數組,就可以直接拿array[n]。

    /**
     * 讀取下標爲2的元素,結果爲5
     */
    private static void readArray() {
        int[] array = new int[] {7,0,5,2,2,2};
        System.out.println(array[2]);
    }

 

更新元素

只需將新值往數組的某一個元素位置塞入。

    /**
     * 將數組下標爲3的元素替換爲7
     */
    private static void updateArray() {
        int[] array = new int[] {7,0,5,2,2,2};
        array[3] = 7;
        System.out.println(array[3]);
    }

 

插入元素

插入元素存在三種情況:尾部插入、中間插入、超範圍插入,其中尾部插入和中間插入是在數組的實際元素數量小於數組長度的情況下進行的,下面一一來看。

 

尾部插入

尾部插入直接將要插入的元素直接放在數組尾部的空閒位置即可。

 

中間插入

因爲每一個元素都有固定的下標,所以在中間插入的時候需要將要插入的位置和後面的元素向後移動,把地方騰出來,再把騰出來的那個位置插入元素。

    /**
     * 在指定位置插入元素
     * @param index   插入的位置
     * @param element   插入的元素
     * @param size   數組實際元素數量
     */
    private static void insert(int index,int element) throws Exception{
        //判斷是否超出範圍
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("out of array");
        }
        //從右向左循環查找到要插入的下標,把右邊的元素逐個向右挪1位。
        //i代表最後一個元素的下標,如果最後的下標大於要插入元素的下標,
        //那麼代表插入元素的位置在最後一個下標之前,
        //所以,佔了這個下標的元素和之後的元素都要向後移一位。
        for(int i=size-1;i >= index; i--) {
            array[index + 1] = array[i];
        }
        //騰出的位置放入新元素
        array[index] = element;
        //數組實際元素數量+1
        size++;
    }

 

超範圍插入

超範圍插入的意思就是現在有一個已經裝滿元素的數組了,現在還想往裏面插入一個元素,該怎麼辦呢?

這就需要數組擴容了,但是數組的長度在創建時就已經確定了,所以可以創建一個新數組,再把舊數組的元素統統複製過去,這樣就實現了數組的擴容。

    /**
     * 實現數組擴容
     */
    public static void resize() {
        int[] arrayNew = new int[array.length * 2];
        //從舊數組複製到新數組中
        //參數1:源數組
        //參數2:源數組中拷貝元素的起始位置
        //參數3:目標數組
        //參數4:拷貝到目標數組的起始位置
        //參數5:拷貝元素的個數
        System.arraycopy(array, 0, arrayNew, 0, array.length);
    }

擴容之後的數組,又可以使用中間插入的方式來插入元素了。

 

刪除元素

刪除元素的道理與插入元素大致相同,只是與插入元素反着來而已,插入元素是從右到左,一個一個挪位子給需要插入的元素騰出來位子;刪除元素是從左到右,把要刪除的元素右邊的那些元素一個個的向左挪。

    /**
     * 數組刪除元素
     * @param index  刪除的位置
     * @param size   數組實際元素數量
     */
    public static void delete(int index)throws Exception{
        //判斷是否超出範圍
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("out of array");
        }
        //從左到右循環,將元素逐個向左挪一位
        for(int i=index;i < size-1; i++) {
            array[i] = array[i+1];
        }
        //數組實際元素數量-1
        size--;
    }

 

總結

由於數組連續緊密的存儲在內存中,只要給出下標,就能非常高效的隨機訪問能力;但插入刪除元素需要後面的元素向左向右移動,嚴重的影響了效率。

所以,數組適合的場景是:讀操作多、寫操作少

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章