本文以實踐為主,舉幾個基本的常用的例子。所以原始碼已上傳至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
您的點贊和關注是對我最大的支援,謝謝!