Sắp xếp · Chọn · Không ổn định
Selection Sort
Sắp xếp chọn — mỗi lượt tìm phần tử nhỏ nhất trong vùng chưa sắp và hoán đổi nó về đầu. Ưu điểm: số lần hoán đổi tối thiểu O(n).
Tốc độ
Chưa xử lý
Min hiện tại
Đang quét
Hoán đổi
Đã sắp xong
So sánh0
Hoán đổi0
Lượt0
Nhấn Chạy hoặc Bước kế...
Ý tưởng
Chia mảng thành phần đã sắp (trái) và phần chưa sắp (phải). Mỗi lượt i, tìm chỉ số phần tử nhỏ nhất minIdx trong a[i..n-1], rồi hoán đổi a[i] và a[minIdx].
Điểm đặc biệt: Selection Sort luôn thực hiện đúng n-1 lần hoán đổi (thực ra ≤ n-1 nếu bỏ qua khi minIdx == i). Điều này tốt khi thao tác ghi (write) đắt hơn đọc (read).
Cài đặt C
selection_sort.c
#include <stdio.h> void selectionSort(int a[], int n) { for (int i = 0; i < n - 1; i++) { /* Tìm chỉ số nhỏ nhất trong a[i..n-1] */ int minIdx = i; for (int j = i + 1; j < n; j++) { if (a[j] < a[minIdx]) minIdx = j; } /* Hoán đổi về đầu vùng chưa sắp */ if (minIdx != i) { int tmp = a[i]; a[i] = a[minIdx]; a[minIdx] = tmp; } } } int main() { int a[] = {64, 25, 12, 22, 11}; int n = sizeof(a) / sizeof(a[0]); selectionSort(a, n); for (int i = 0; i < n; i++) printf("%d ", a[i]); /* Output: 11 12 22 25 64 */ return 0; }
Độ phức tạp
| Trường hợp | Thời gian | Hoán đổi | Ghi chú |
|---|---|---|---|
| Mọi trường hợp | O(n²) | O(n) | Luôn duyệt n(n-1)/2 lần so sánh |
✅
Khi nào dùng: Dữ liệu nhỏ (< 20 phần tử) và chi phí ghi bộ nhớ cao — Selection Sort thực hiện ít ghi nhất trong 3 thuật toán O(n²).