深入理解陣列-下

弒曉風發表於2019-02-19

本文以實踐為主,舉幾個基本的常用的例子。所以原始碼已上傳至github:連結

No.1 實現一個大小固定的有序陣列,支援動態增刪改操作,支援動態擴容 

1.查詢陣列中指定元素

	public int find(int index) {
		if (index < 0 || index > count)
			return -1;
		return array[index];
	}複製程式碼

2.向陣列中插入元素,如果陣列已滿,則擴容

	public boolean insert(int index, int value) {
		if (index < 0 || index > count)
			return false;
		if (count == size) {
			arrayExpansion(size * 2);
			System.out.println("動態擴容....");
		}

		for (int i = count - 1; i > index; --i) {
			array[i + 1] = array[i];
		}
		array[index] = value;
		++count;
		return true;
	}複製程式碼

3.刪除元素,當陣列中元素數量小於一定程度的時候,則進行縮容

	public boolean delete(int index) {
		if (index < 0 || index > count)
			return false;
		for (int i = index + 1; i < count; i++) {
			array[i - 1] = array[i];
		}
		--count;
		// 縮容
		if (count == array.length / 4 && array.length / 2 != 0) {
			arrayExpansion(array.length / 2);
			System.out.println("動態縮容....");
		}
		return true;
	}複製程式碼

4.擴容方法

	private boolean arrayExpansion(int capacity) {
		int[] newArray = new int[capacity];
		for (int i = 0; i < size; i++) {
			newArray[i] = array[i];
		}
		array = newArray;
		return true;
	}複製程式碼

5.測試

	public static void main(String[] args) {
		Array array = new Array(10);
		for (int i = 0; i < array.size; ++i) {
			array.insert(i, i);
		}
		array.printAll();
		//擴容
		array.insert(10, 10);
		array.printAll();
		//縮容
		for (int i = array.size; i > array.size/ 4; --i) {
			array.delete(i);
		}
		array.printAll();
	}複製程式碼

6.執行結果

深入理解陣列-下

No.2 實現兩個有序陣列合併為一個有序陣列 .

描述:

將一個長度為m的有序陣列array1和一個長度為n的有序陣列array2合併為一個有序陣列。

思路1:

首先想到的方法是建立一個長度為m+n的array3陣列,以此從array1和array2中取出元素進行比較,然後將較小的元素加入array3,然後在考慮array1陣列有剩餘和array2陣列有剩餘的兩種情況,最後在把新陣列的元素重新加入到array3陣列中即可。

但是這種思路會佔用額外的空間。

具體實現如下:

	public int[] merge1(int[] array1, int m, int[] array2, int n) {
		int[] array3 = new int[m + n];
		int i = 0;
		int j = 0;
		int k = 0;
		// 通過一個while迴圈來進行新增
		while (i < m && j < n) {
			if (array1[i] < array2[j]) {
				// 將array1的元素加入array3,下標各加一
				array3[k++] = array1[i++];
			} else {
				// 將array2的元素加入array3,下標各加一
				array3[k++] = array2[j++];
			}
		}
		// 如果array1有剩餘
		if (i != m) {
			while (i < m) {
				array3[k++] = array1[i++];
			}
		}
		// 如果array2有剩餘
		if (j != n) {
			while (j < n) {
				array3[k++] = array2[j++];
			}
		}
		return array3;
	}複製程式碼

測試結果:

深入理解陣列-下

思路2:

因為從前往後排序的話,會涉及到陣列元素多次移動,所以我們考慮從後往前進行排序,也就是末尾排序法

前提:預設array1陣列長度為m+n

具體實現如下:

public int[] merge2(int[] array1, int m, int[] array2, int n) {
		// 兩個有序陣列所有陣列總和
		int num = m + n - 1;
		--m;
		--n;
		while (m >= 0 && n >= 0) {
			if (array2[n] > array1[m]) {
				array1[num--] = array2[n--];
			} else {
				array1[num--] = array1[m--];
			}
		}
		// 將n中剩餘的資料加入array1
		while (n >= 0) {
			array1[num--] = array2[n--];
		}
		return array1;
	}複製程式碼

或者更精簡,一個三元表示式搞定

	public int[] mergeOpt2(int[] array1, int m, int[] array2, int n) {
		int num = m + n - 1;
		int i = m - 1;
		int j = n - 1;
		while (j >= 0) {
			array1[num--] = i >= 0 && array1[i] > array2[j] ? array1[i--] : array2[j--];
		}
		return array1;
	}複製程式碼

測試結果:

深入理解陣列-下


end

深入理解陣列-下

您的點贊和關注是對我最大的支援,謝謝!


相關文章