1. 程式人生 > >JAVA的資料結構和演算法(一)陣列

JAVA的資料結構和演算法(一)陣列

動態陣列的基本增刪改查

實現程式碼

package com.struct;

/**
 * 封裝的陣列
 * 功能:增刪改查
 */
public class MyArray {

    private long[] array;

    //表示有效的資料長度
    private int elements;

    public MyArray() {
        array = new long[50];
    }

    public MyArray(int maxsize) {
        array = new long[maxsize];
    }
//新增資料 public void insert(long value) { array[elements] = value; elements++; } //顯示資料 public void display() { System.out.print("["); for (int i = 0; i < elements; i++) { System.out.print(array[i] + " "); } System.out.println
("]"); } //查詢資料根據值 public int searchByValue(int value) { int i; for (i = 0; i < elements; i++) { if (value == array[i]) { break; } } if (i == elements) { return -1; } else { return i;
} } //查詢資料根據索引 public long searchByIndex(int index) { if (index >= elements || index < 0) { throw new ArrayIndexOutOfBoundsException(); } else { return array[index]; } } //刪除資料 根據index 將後面的值覆蓋前面的值,然後將陣列的長度減少1 public void delete(int index) { if (index >= elements || index < 0) { throw new ArrayIndexOutOfBoundsException(); } else { for (int i = index; i < elements; i++) { array[i] = array[i + 1]; } elements--; } } //更新資料 public void update(int index, int newValue) { if (index >= elements || index < 0) { throw new ArrayIndexOutOfBoundsException(); } else { array[index] = newValue; } } }

測試程式碼

package com.struct;

public class TestMyArray {
    public static void main(String[] args) {
        MyArray array = new MyArray();
        array.insert(10);
        array.insert(11);
        array.insert(12);
        array.insert(13);
        array.display();
        System.out.println(array.searchByIndex(3));
        System.out.println(array.searchByValue(13));
        array.update(0,88);
        array.display();
        array.delete(0);
        array.display();
    }
}

測試結果

[10 11 12 13 ]
13
3
[88 11 12 13 ]
[11 12 13 ]

有序陣列

修改新增資料

思路:將數組裡面的值一個個往後移動,從最後一個開始移動

將插入的值覆蓋插入的位置即可

//新增資料 
public void insert(long value){
    int i;
    for (i = 0; i <elements ; i++) {
        if (value< array[i]){
            break;
        }
    }
    for (int j=elements;j > i;j--){
        array[j]= array[j-1];
    }
    array[i] = value;
    elements++;
}

線性查詢

二分法查詢

前提:陣列時有序的

不斷的從中間開始,故先while死迴圈,將pow值和low值累加相除2,然後賦值給middle

/*
二分查詢演算法
 */
public int binarySearch(long value) {
    int middle = 0;
    int low = 0;
    int pow = elements;
    while (true){
        int middle = (pow + low) / 2;
        if (array[middle] == value){
            return middle
        }else if (pow < low){
            return -1;
        }else {
            //小了就改大,大了就改小
            if (value < array[middle]){
                pow = middle -1;
            }else {
                low = middle +1;
            }
        }
    }
}