Sắp xếp nổi bọt (Bubble Sort) – Minh họa trong Python và Scratch
Sắp xếp nổi bọt (Bubble Sort) – Minh họa trong Python và Scratch
Sắp xếp nổi bọt (Bubble Sort) là gì?
Sắp xếp nổi bọt là một thuật toán sắp xếp đơn giản nhưng hiệu quả. Ý tưởng của thuật toán này là so sánh các cặp phần tử liền kề trong danh sách và hoán đổi chúng nếu chúng không theo thứ tự mong muốn. Quá trình này lặp lại cho đến khi danh sách được sắp xếp hoàn toàn.
Để hiểu cách thuật toán hoạt động, hãy xem xét một ví dụ. Giả sử chúng ta có một danh sách số nguyên không được sắp xếp như sau: [5, 2, 8, 3, 1] . Chúng ta sẽ sử dụng thuật toán sắp xếp nổi bọt để sắp xếp danh sách này theo thứ tự tăng dần.
Bước 1: Duyệt qua danh sách và so sánh các cặp phần tử liền kề. Trong ví dụ này, chúng ta bắt đầu với [5, 2, 8, 3, 1] . Ta so sánh các cặp phần tử liền kề như sau:
- So sánh (5, 2): Vì 5 lớn hơn 2, nên hoán đổi chúng. Danh sách trở thành [2, 5, 8, 3, 1] .
- So sánh (5, 8): Không cần hoán đổi vì chúng đã theo thứ tự.
- So sánh (8, 3): Vì 8 lớn hơn 3, nên hoán đổi chúng. Danh sách trở thành [2, 5, 3, 8, 1] .
- So sánh (8, 1): Vì 8 lớn hơn 1, nên hoán đổi chúng. Danh sách trở thành [2, 5, 3, 1, 8] .
Bước 2: Tiếp tục duyệt qua danh sách và lặp lại quá trình so sánh và hoán đổi. Danh sách sẽ trở thành [2, 3, 1, 5, 8] .
Bước 3: Tiếp tục duyệt qua danh sách và lặp lại quá trình so sánh và hoán đổi. Danh sách sẽ trở thành [2, 1, 3, 5, 8] .
Bước 4: Tiếp tục duyệt qua danh sách và lặp lại quá trình so sánh và hoán đổi. Danh sách sẽ trở thành [1, 2, 3, 5, 8] .
Khi không có hoán đổi nào xảy ra trong quá trình duyệt qua danh sách, ta có thể kết luận rằng danh sách đã được sắp xếp hoàn toàn. Kết quả cuối cùng là danh sách [1, 2, 3, 5, 8] , theo thứ tự tăng dần.
Thuật toán sắp xếp nổi bọt hoạt động bằng cách đưa các phần tử nhỏ hơn dần lên trên, tương tự như khi các bong bóng nhỏ trong một cốc chất lỏng nổi lên trên. Cứ như vậy, các phần tử lớn hơn sẽ “nổi lên” và đứng ở đúng vị trí của chúng.
Minh họa sắp xếp nổi bọt (Bubble Sort) bằng Python:
def bubble_sort(arr): n = len(arr) for i in range(n): # Duyệt qua từng cặp phần tử liên tiếp # và hoán đổi chúng nếu chúng không theo thứ tự for j in range(n - i - 1): if arr[j] > arr[j + 1] : arr[j] , arr[j + 1] = arr[j + 1] , arr[j] return arr # Ví dụ sử dụng arr = [64, 34, 25, 12, 22, 11, 90] sorted_arr = bubble_sort(arr) print("Danh sách đã sắp xếp:", sorted_arr)
Kết quả:Danh sách đã sắp xếp: [11, 12, 22, 25, 34, 64, 90]
Trong ví dụ trên, chúng ta triển khai hàm bubble_sort
để sắp xếp một danh sách (arr
). Trong vòng lặp bên ngoài, chúng ta duyệt qua từng phần tử và trong vòng lặp bên trong, chúng ta so sánh các cặp phần tử liên tiếp và hoán đổi chúng nếu chúng không theo thứ tự. Quá trình này được lặp lại cho đến khi danh sách được sắp xếp hoàn toàn. Kết quả cuối cùng là danh sách đã sắp xếp.
Thuật toán sắp xếp nổi bọt (Bubble Sort) trong Scratch:
Dưới đây là một ví dụ về cách triển khai thuật toán sắp xếp nổi bọt (Bubble Sort) bằng Scratch, một môi trường lập trình trực quan dành cho trẻ em:
- Tạo một danh sách các số cần sắp xếp. Trong ví dụ này, chúng ta sử dụng một danh sách gồm các số nguyên từ 0 đến 9 thứ tự lung tung
- Tạo một biến
length
và đặt giá trị bằng độ dài của danh sách. - Tạo một biến
swapped
và đặt giá trị ban đầu làTrue
để bắt đầu vòng lặp. - Tạo một vòng lặp chạy cho đến khi
swapped
làFalse
. Trong mỗi vòng lặp, ta sẽ thiết lậpswapped
thànhFalse
và thực hiện sắp xếp. -
Trong vòng lặp, duyệt qua từng cặp phần tử liên tiếp trong danh sách.
- So sánh hai phần tử và nếu phần tử sau lớn hơn phần tử trước, thực hiện hoán đổi vị trí của chúng và đặt
swapped
thànhTrue
.
- So sánh hai phần tử và nếu phần tử sau lớn hơn phần tử trước, thực hiện hoán đổi vị trí của chúng và đặt
- Đặt
swapped
thànhTrue
nếu có bất kỳ hoán đổi nào xảy ra trong vòng lặp. - Khi vòng lặp kết thúc và không có hoán đổi nào xảy ra, ta có thể kết luận rằng danh sách đã được sắp xếp.
- In danh sách đã sắp xếp.
Trong ví dụ trên, danh sách sẽ được hiển thị trước và sau khi sắp xếp. Mỗi số được đại diện bằng một hình tròn và các số đã sắp xếp sẽ được di chuyển lên trên. Khi không có hoán đổi nào xảy ra nữa, thuật toán dừng lại và kết quả cuối cùng được hiển thị.
Lưu ý rằng việc triển khai thuật toán sắp xếp nổi bọt trong Scratch có thể đòi hỏi sự tương tác với các khối lệnh, và hình ảnh minh họa chỉ mang tính chất đại diện cho cách thuật toán hoạt động chứ không phải là một chương trình Scratch hoàn chỉnh.