【Java基礎】陣列和演算法
阿新 • • 發佈:2020-12-13
陣列和演算法
查詢演算法
線性查詢
...
二分查詢
二分查詢要求資料結構是有序的。
package com.parzulpan.java.ch03; /** * @Author : parzulpan * @Time : 2020-11-17 * @Desc : 二分查詢 */ public class BinaryFind { public static boolean binaryFind(int[] arr, int number) { boolean isFlag = false; int start = 0, end = arr.length - 1; while (start <= end) { int mid = (start + end) / 2; if (arr[mid] == number) { isFlag = true; break; } else if (arr[mid] > number) { end = mid - 1; } else { start = mid + 1; } } return isFlag; } public static void main(String[] args) { int[] arr = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999}; System.out.println(binaryFind(arr, 256)); System.out.println(binaryFind(arr, 1342)); } }
排序演算法
排序:假設含有 n 個記錄的序列為 {R1,R2,...,Rn},其相應的關鍵字序列為 {K1,K2,...,Kn}。將這些記錄重新排序為 {Ri1,Ri2,...,Rin},使得相應的關鍵字值滿足條 Ki1<=Ki2<=...<=Kin,這樣的一種操作稱為排序。
通常來說,排序的目的是快速查詢。
衡量排序演算法的優劣:
- 時間複雜度:分析關鍵字的比較次數和記錄的移動次數;
- 空間複雜度:分析排序演算法中需要多少輔助記憶體;
- 穩定性:若兩個記錄 A 和 B 的關鍵字值相等,但排序後 A、B 的先後次序保持不變,則稱這種排序演算法是穩定的。
排序演算法分類:
- 內部排序:整個排序過程不需要藉助於外部儲存器(如磁碟等),所有排序操作都在記憶體中完成;
- 外部排序:參與排序的資料非常多,資料量非常大,計算機無法把整個排序過程放在記憶體中完成,必須藉助於外部儲存器(如磁碟)。外部排序最常見的是多路歸併排序。可以認為外部排序是由多次內部排序組成。
內部排序演算法:
- 選擇排序:直接選擇排序、堆排序;
- 交換排序:氣泡排序、快速排序;
- 插入排序:直接插入排序、折半插入排序、希爾排序;
- 歸併排序;
- 桶排序;
- 基數排序。
其中,快速排序、直接選擇排序、希爾排序和堆排序是不穩定排序。
!待更新
排序演算法效能對比:
排序方法 | 平均時間複雜度 | 平均時間複雜度 | 平均時間複雜度 | 空間複雜度 | 穩定性 |
---|---|---|---|---|---|
直接選擇排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不穩定 |
堆排序 | O(nlog2n) |
O(nlog2n) |
O(nlog2n) |
O(1) |
不穩定 |
氣泡排序 | O(n^2) |
O(n^2) |
O(n) |
O(1) |
穩定 |
快速排序 | O(nlog2n) |
O(n^2) |
O(nlog2n) |
O(nlog2n) |
不穩定 |
直接插入排序 | O(n^2) |
O(n^2) |
O(n) |
O(1) |
穩定 |
直接選擇排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不穩定 |
直接選擇排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不穩定 |
直接選擇排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不穩定 |
直接選擇排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不穩定 |
直接選擇排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不穩定 |
排序演算法效能比較:
排序演算法的選擇:
Arrays 工具類
java.util.Arrays 類即為運算元組的工具類,包含了用來運算元組(比如排序和搜尋)的各種方法。
常見方法:
方法 | 說明 |
---|---|
boolean equals(int[] a,int[] b) |
判斷兩個陣列是否相等。 |
String toString(int[] a) |
輸出陣列資訊。 |
void fill(int[] a,int val) |
將指定值填充到陣列之中。 |
void sort(int[] a) |
對陣列進行排序。 |
int binarySearch(int[] a,int key) |
對排序後的陣列進行二分法檢索指定的值。 |
package com.parzulpan.java.ch03;
import java.util.Arrays;
/**
* @Author : parzulpan
* @Time : 2020-11-17
* @Desc : Arrays 工具類的常用方法
*/
public class ArraysTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
System.out.println(Arrays.equals(arr1, arr2));
System.out.println(Arrays.toString(arr1));
int[] arr3 = new int[]{1, 2, 3, 4};
Arrays.fill(arr3, 10);
System.out.println(Arrays.toString(arr3));
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
int[] arr4 = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
int index = Arrays.binarySearch(arr4, 239);
if (index < 0) {
System.out.println("arr4 中不存在 " + 239);
}
}
}
練習和總結
!待更新