Menu
CoddyTech

Sắp xếp nổi bọt

Cập nhật lần cuối

Sắp xếp nổi bọt (bubble sort) liên tục duyệt qua danh sách, so sánh từng cặp phần tử kề nhau và đổi chỗ chúng nếu sai thứ tự. Sau mỗi lượt đầy đủ, giá trị lớn nhất còn lại đã "nổi" lên đúng vị trí của nó ở cuối, nên mỗi lượt sau xét ít hơn một phần tử. Nhấn Phát ở trên để xem các lần so sánh và đổi chỗ, hoặc chạy từng bước một.

Đây là một trong những thuật toán sắp xếp dễ hiểu nhất, nên rất phù hợp để làm thuật toán đầu tiên, nhưng thời gian chạy O(n²) khiến nó không thực tế với dữ liệu lớn.

Độ phức tạp thời gian và không gian

Trường hợpĐộ phức tạpGhi chú
Tốt nhấtO(n)Mảng đã sắp xếp, có kiểm tra dừng sớm
Trung bìnhO(n²)Thứ tự ngẫu nhiên
Xấu nhấtO(n²)Sắp xếp ngược
Không gianO(1)Sắp xếp tại chỗ, chỉ cần một biến tạm
Ổn địnhCóCác phần tử bằng nhau giữ nguyên thứ tự tương đối

Từng bước thực hiện

BướcĐiều gì xảy ra
1Bắt đầu từ đầu mảng.
2So sánh phần tử hiện tại với phần tử kế tiếp.
3Nếu chúng sai thứ tự, đổi chỗ hai phần tử.
4Dịch sang phải một vị trí và lặp lại đến cuối mảng (một lượt).
5Lặp lại các lượt; mỗi lượt cố định thêm một phần tử ở cuối.
6Dừng khi một lượt đầy đủ không có lần đổi chỗ nào.

Ví dụ minh họa

Sắp xếp [5, 2, 4, 1]:

LượtMảngThao tác
1[2, 4, 1, 5]Đổi chỗ 5,2, rồi 5,4, rồi 5,1; 5 nổi lên cuối mảng.
2[2, 1, 4, 5]2,4 đúng thứ tự; đổi chỗ 4,1; 4,5 đúng thứ tự; 4 đã vào đúng vị trí.
3[1, 2, 4, 5]Đổi chỗ 2,1; phần còn lại đã đúng thứ tự; 2 đã vào đúng vị trí.
4[1, 2, 4, 5]Một lượt đầy đủ không có lần đổi chỗ nào, nên mảng đã được sắp xếp và thuật toán dừng.

Khi nào nên dùng sắp xếp nổi bọt

Nên dùng khiTránh dùng khi
Dạy hoặc học cách các thuật toán sắp xếp bằng so sánh hoạt độngSắp xếp dữ liệu lớn, khi O(n²) là quá chậm
Dữ liệu rất nhỏ hoặc gần như đã sắp xếp (với dừng sớm, thuật toán tiệm cận O(n))Bạn cần thuật toán sắp xếp đa dụng nhanh nhất: hãy dùng quicksort hoặc merge sort
Bạn cần một thuật toán sắp xếp ổn định, tại chỗ với rất ít codeDữ liệu theo thứ tự ngẫu nhiên và hiệu năng là yếu tố quan trọng
Kiểm tra xem một danh sách ngắn đã được sắp xếp hay chưa chỉ trong một lượtViệc ghi nhiều lần tốn kém (ví dụ bộ nhớ flash); sắp xếp chọn đổi chỗ ít hơn

Code Bubble Sort

Một cách cài đặt Bubble Sort gọn gàng, chạy được ngay bằng Python, JavaScript, Java, C++, C, Pseudocode. Chọn một ngôn ngữ, sao chép code hoặc mở sẵn trong Coddy Playground.

Code Bubble Sort bằng Python

Python
1def bubble_sort(a):2    n = len(a)3    for i in range(n - 1):4        swapped = False5        for j in range(n - 1 - i):6            if a[j] > a[j + 1]:7                a[j], a[j + 1] = a[j + 1], a[j]8                swapped = True9        if not swapped:10            break  # no swaps means the list is already sorted11    return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)
Chạy code này trong Playground Python

Câu hỏi thường gặp về sắp xếp nổi bọt

Độ phức tạp thời gian của sắp xếp nổi bọt là bao nhiêu?
Sắp xếp nổi bọt chạy trong thời gian O(n²) ở trường hợp trung bình và xấu nhất do có hai vòng lặp lồng nhau. Với tối ưu dừng sớm, thuật toán có thể đạt O(n) trên mảng đã sắp xếp. Nó dùng thêm O(1) bộ nhớ.
Sắp xếp nổi bọt có ổn định không?

Có. Sắp xếp nổi bọt chỉ đổi chỗ hai phần tử kề nhau khi chúng thực sự sai thứ tự, nên các phần tử bằng nhau không bao giờ vượt qua nhau và giữ nguyên thứ tự tương đối ban đầu.

Vì sao gọi là sắp xếp nổi bọt?

Ở mỗi lượt, giá trị lớn nhất chưa được sắp xếp di chuyển từng bước về cuối mảng, giống như bọt khí nổi lên mặt nước, vì thế mới có tên "nổi bọt".

Sắp xếp nổi bọt và sắp xếp chèn khác nhau như thế nào?
Cả hai đều chạy trong O(n²), ổn định và sắp xếp tại chỗ, nhưng di chuyển dữ liệu khác nhau: sắp xếp nổi bọt liên tục đổi chỗ các cặp kề nhau sai thứ tự, còn sắp xếp chèn lấy từng phần tử và dời nó về đúng vị trí trong phần đầu đã sắp xếp. Sắp xếp chèn thường ghi ít hơn và chạy nhanh hơn trong thực tế, nhất là với dữ liệu gần như đã sắp xếp.
Khi nào nên dùng sắp xếp nổi bọt thay cho quicksort?
Gần như không bao giờ với khối lượng công việc thực tế: thời gian trung bình O(n log n) của quicksort vượt xa O(n²) của sắp xếp nổi bọt, trừ khi dữ liệu rất nhỏ. Sắp xếp nổi bọt chỉ đáng dùng khi danh sách rất nhỏ hoặc gần như đã sắp xếp, hoặc khi bạn muốn một thuật toán sắp xếp ổn định đơn giản nhất để giảng dạy.
Tối ưu dừng sớm có thay đổi trường hợp xấu nhất của sắp xếp nổi bọt không?
Không. Theo dõi xem một lượt có lần đổi chỗ nào không giúp sắp xếp nổi bọt dừng sớm và đạt O(n) với dữ liệu đã sắp xếp, nhưng một mảng sắp xếp ngược vẫn cần mọi lần so sánh, nên trường hợp xấu nhất vẫn là O(n²). Tối ưu này chỉ giúp trường hợp tốt nhất và dữ liệu gần như đã sắp xếp.
Hình minh họa các ngôn ngữ lập trình của Coddy

Thành thạo thuật toán cùng Coddy

Bắt đầu