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]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ợpThời gianHoán đổiGhi chú
Mọi trường hợpO(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²).