Bubble Sort

Sắp xếp nổi bọt — liên tục hoán đổi hai phần tử kề nhau nếu sai thứ tự. Sau mỗi lượt, phần tử lớn nhất "nổi" lên vị trí đúng ở cuối.

Tốc độ
Chưa xử lý Đang so sánh 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

Mỗi lượt duyệt từ đầu đến cuối phần chưa sắp, so sánh từng cặp kề nhau a[j]a[j+1]. Nếu sai thứ tự thì hoán đổi. Sau lượt i, phần tử lớn nhất đã về đúng vị trí ở cuối.

Tối ưu quan trọng: nếu một lượt không có hoán đổi nào → mảng đã sắp xong → dừng sớm, đạt O(n) với mảng đã sắp.

Cài đặt C

bubble_sort.c
#include <stdio.h>
#include <stdbool.h>

void swap(int *a, int *b) {
    int t = *a; *a = *b; *b = t;
}

/* Bubble Sort — sắp xếp tăng dần, O(n²) */
void bubbleSort(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        bool swapped = false;

        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                swap(&a[j], &a[j + 1]);
                swapped = true;
            }
        }
        /* Dừng sớm nếu không hoán đổi */
        if (!swapped) break;
    }
}

int main() {
    int a[] = {38, 27, 43, 3, 9, 82, 10};
    int n = sizeof(a) / sizeof(a[0]);
    bubbleSort(a, n);
    for (int i = 0; i < n; i++) printf("%d ", a[i]);
    /* Output: 3 9 10 27 38 43 82 */
    return 0;
}

Độ phức tạp

Trường hợpThời gianKhông gianGhi chú
Tốt nhấtO(n)O(1)Mảng đã sắp, cờ swapped dừng sớm
Trung bìnhO(n²)O(1)
Tệ nhấtO(n²)O(1)Mảng sắp ngược (n-1 lượt đầy đủ)