每一輪從未排序區間選出最小值,放到已排序區間末尾。透過雙層迴圈實現:
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr.length; y++) {
if (arr[x] > arr[y]) { /* 交換 */ }
}
}
// 問題:內層掃描整個陣列,包含已排序區,重複比較
for (int x = 0; x < arr.length; x++) {
for (int y = x + 1; y < arr.length; y++) {
if (arr[x] > arr[y]) { /* 交換 */ }
}
}
// 問題:外層最後一輪 x = length-1 時,內層不執行,但外層仍多跑一次
for (int x = 0; x < arr.length - 1; x++) { // 最後一個元素自然就位,無需處理
for (int y = x + 1; y < arr.length; y++) { // 只掃描未排序區
if (arr[x] > arr[y]) {
// 交換邏輯
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
public class SelectionSortDemo {
public static void main(String[] args) {
int[] arr = {2, 5, 4, 1};
int[] sorted = selectionSort(arr);
System.out.print("排序結果: ");
for (int n : sorted) System.out.print(n + " "); // 1 2 4 5
}
public static int[] selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
}
<?php
class ArrayDemo {
public static function main() {
$arr = [2, 5, 4, 1];
print_r(self::selectionSort($arr));
// Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 )
}
public static function selectionSort($arr) {
for ($i = 0; $i < count($arr) - 1; $i++) {
for ($j = $i + 1; $j < count($arr); $j++) {
if ($arr[$i] > $arr[$j]) {
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
}
ArrayDemo::main();
| 指標 | 數值 | 說明 |
|---|---|---|
| 時間複雜度 (最好/平均/最差) | O(n²) | 無論輸入分佈,比較次數固定為 n(n-1)/2 |
| 空間複雜度 | O(1) | 原地排序,僅需 1 個暫存變數 |
| 穩定性 | 不穩定 | 相等元素可能因交換改變相對順序 |
| 交換次數 | O(n) | 每輪最多 1 次交換,優於冒泡排序的 O(n²) |
public static void selectionSortOptimized(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 只記錄索引,不交換
}
}
if (minIndex != i) { // 單輪結束只交換一次
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
優勢:減少陣列寫入操作,對於「寫入成本高」的儲存介質 (如 EEPROM、某些快取場景) 有實質幫助。
Arrays.sort() (Dual-Pivot Quicksort + TimSort,O(n log n))| 演算法 | 平均時間 | 空間 | 穩定 | 備註 |
|---|---|---|---|---|
| 選擇排序 | O(n²) | O(1) | 否 | 交換少,教學用 |
| 冒泡排序 | O(n²) | O(1) | 是 | 可早期終止優化 |
| 插入排序 | O(n²) | O(1) | 是 | 小資料/近乎有序極快 |
| 希爾排序 | O(n^1.3~n^1.5) | O(1) | 否 | 插入排序改進,間距分組 |
| 快速排序 | O(n log n) | O(log n) | 否 | 實務最快通用排序 |
| 歸併排序 | O(n log n) | O(n) | 是 | 穩定、外部排序基礎 |
| 堆積排序 | O(n log n) | O(1) | 否 | 保證 O(n log n) 最差 |