本文展示如何生成10個隨機整數,使用 Arrays.sort() 快速排序,並手寫 選擇排序 算法演示原理。附帶插入新元素後再次排序的完整流程。
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class SortDemo {
public static void main(String[] args) {
// 1. 生成10個 1-100 隨機整數
int[] arr = new int[11]; // 預留第11位用於插入
Random random = new Random();
System.out.print("原始隨機數組: ");
for (int i = 0; i < 10; i++) {
arr[i] = random.nextInt(100) + 1;
System.out.print(arr[i] + " ");
}
System.out.println();
// 2. 使用 JDK 內置排序 (雙軸快速排序, 針對基本類型)
Arrays.sort(arr, 0, 10); // 只排前10個有效元素
System.out.print("Arrays.sort 升序: ");
for (int i = 0; i < 10; i++) System.out.print(arr[i] + " ");
System.out.println();
// 3. 手寫選擇排序 (教學演示)
// 重新生成數據
for (int i = 0; i < 10; i++) arr[i] = random.nextInt(100) + 1;
selectionSort(arr, 10);
System.out.print("選擇排序 升序: ");
for (int i = 0; i < 10; i++) System.out.print(arr[i] + " ");
System.out.println();
// 4. 用戶輸入一個數,插入並重新排序
Scanner scanner = new Scanner(System.in);
System.out.print("\n請輸入一個整數插入數組: ");
int newNum = scanner.nextInt();
arr[10] = newNum; // 放入預留位
Arrays.sort(arr); // 排序全部11個元素
System.out.print("插入後排序: ");
for (int i = 0; i < 11; i++) System.out.print(arr[i] + " ");
System.out.println();
scanner.close();
}
// 選擇排序: 每輪從未排序部分選最小, 放到已排序部分末尾
public static void selectionSort(int[] arr, int n) {
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) minIdx = j;
}
if (minIdx != i) {
int temp = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = temp;
}
}
}
}
原始隨機數組: 45 12 78 3 99 56 23 67 11 90
Arrays.sort 升序: 3 11 12 23 45 56 67 78 90 99
選擇排序 升序: 3 11 12 23 45 56 67 78 90 99
請輸入一個整數插入數組: 50
插入後排序: 3 11 12 23 45 50 56 67 78 90 99
| 算法 | 時間複雜度 | 空間 | 穩定性 | Java實現 |
|---|---|---|---|---|
| Arrays.sort (基本類型) | O(n log n) | O(log n) 棧 | 不穩定 | 雙軸快速排序 |
| Arrays.sort (對象數組) | O(n log n) | O(n) | 穩定 | TimSort (歸併+插入) |
| 選擇排序 | O(n²) | O(1) | 不穩定 | 教學/極小數據/交換成本高 |
| 插入排序 | O(n²) / 最好O(n) | O(1) | 穩定 | 小數組/近乎有序/TimSort基礎 |
| 歸併排序 | O(n log n) | O(n) | 穩定 | 外部排序/併發/對象排序 |
Arrays.sort() / Collections.sort():經過極致優化、測試充分、支持並行 (Java 8+ Arrays.parallelSort())。Comparable 或傳入 Comparator (Lambda: (a,b) -> a - b 或 Comparator.comparingInt(...))。int[] 用快速排序 (不穩定);Integer[] 用 TimSort (穩定),大數據量時基本類型更省內存、更快。若數組已有序,插入新元素只需 二分查找插入位置 + 數組拷貝 (O(n)),優於 O(n log n) 全排序:
public static int[] insertSorted(int[] sortedArr, int value) {
int[] newArr = new int[sortedArr.length + 1];
// 二分查找插入索引
int idx = Arrays.binarySearch(sortedArr, value);
if (idx < 0) idx = -idx - 1; // 未找到時返回插入點
// 複製前半段
System.arraycopy(sortedArr, 0, newArr, 0, idx);
// 插入新值
newArr[idx] = value;
// 複製後半段
System.arraycopy(sortedArr, idx, newArr, idx + 1, sortedArr.length - idx);
return newArr;
}
掌握 Arrays.sort() 一鍵排序、理解選擇排序 O(n²) 原理、學會二分插入優化,能應對 99% Java 排序場景。生產環境堅決使用標準庫,手寫算法僅作理解與考試準備。