Lặp lại việc tìm phần tử nhỏ nhất trong phần chưa sắp xếp rồi đặt vào đầu — luôn O(n²), nhưng số lần đổi chỗ tối thiểu (tối đa n-1 lần).
Vẫn là bài toán sắp xếp mảng tăng dần, nhưng lần này ta tối ưu theo hướng khác Bubble Sort: giảm số lần đổi chỗ (swap) xuống mức tối thiểu, chấp nhận số lần so sánh vẫn ở mức O(n²).
Ở mỗi vòng, quét toàn bộ phần chưa sắp xếp để tìm ra phần tử nhỏ nhất, rồi đổi chỗ nó với
phần tử đầu tiên của phần chưa sắp xếp đó. Sau vòng thứ i, i+1 phần tử đầu mảng đã đúng vị trí
cuối cùng — khác với Bubble Sort (đẩy phần tử lớn nhất về cuối), Selection Sort đẩy phần tử nhỏ
nhất về đầu.
Điểm khác biệt cốt lõi so với Bubble Sort: Bubble Sort đổi chỗ ngay khi phát hiện sai thứ tự (có thể đổi chỗ rất nhiều lần mỗi vòng), còn Selection Sort chỉ đổi chỗ đúng một lần ở cuối mỗi vòng — hữu ích khi thao tác ghi (write) tốn kém hơn nhiều so với thao tác đọc/so sánh.
| Trường hợp | Thời gian | Ghi chú |
|---|---|---|
| Mọi trường hợp | O(n²) | Luôn quét hết phần chưa sắp xếp, kể cả khi mảng đã sắp xếp sẵn |
| Số lần đổi chỗ | Tối đa n-1 | Ít hơn hẳn Bubble Sort, vốn có thể đổi chỗ O(n²) lần |
| Không gian | O(1) | Sắp xếp tại chỗ |
So với Bubble Sort: Selection Sort không có cơ chế dừng sớm khi mảng đã sắp xếp (luôn chạy đủ n-1 vòng so sánh), nhưng bù lại số lần ghi/đổi chỗ ít hơn nhiều — phù hợp hơn khi chi phí ghi bộ nhớ cao (ví dụ ghi vào flash memory).
Mảng [6, 2, 9, 4], vòng đầu tiên (i = 0):
[2, 6, 9, 4]Chỉ một lần đổi chỗ cho cả vòng, dù đã so sánh 3 lần.
Kiểm tra nhanh
So với Bubble Sort, ưu điểm chính của Selection Sort là gì?