So sánh hai phần tử đứng cạnh nhau
Trong cách sắp xếp nổi bọt đang học, ta sắp dãy **tăng dần**. Mỗi vòng xét các cặp liền kề **từ cuối dãy trở về đầu phần chưa sắp**. Nếu số phía sau nhỏ hơn số phía trước thì hoán đổi; nếu đã đúng thứ tự hoặc bằng nhau thì giữ nguyên.
Sau vòng đầu, số nhỏ nhất được đưa về vị trí đầu. Vòng tiếp theo không cần xét lại vị trí đã đúng đó; tiếp tục đưa số nhỏ nhất của phần còn lại về vị trí thứ hai. Làm tương tự đến vị trí trước cuối.
Đây là chiều duyệt dùng trong bài này. Cần đọc rõ chiều so sánh trước khi mô phỏng, vì một cách duyệt khác có thể cho dãy trung gian khác dù cùng kết quả sắp xếp cuối.
Bài luyện
Với dãy 9, 4, 7, 2, 6, cặp nào được so sánh đầu tiên theo cách nổi bọt của bài?
Đó là cặp đầu dãy, khác chiều duyệt từ cuối.
Hai phần tử này không liền kề.
Đây là cặp liền kề cuối dãy.
Trước cặp này còn phải xét các cặp về phía cuối.
Lời giải
Chiều duyệt bắt đầu ở cuối dãy, nên trước hết so sánh phần tử vị trí 4 và 5 là 2, 6. Vì 6 không nhỏ hơn 2 nên chưa hoán đổi.
Theo dõi vòng thứ nhất
Bắt đầu với dãy 9, 4, 7, 2, 6. Sau mỗi lần so sánh, phải dùng dãy vừa nhận được cho lần tiếp theo:
| Cặp vị trí | So sánh | Dãy sau bước này |
|---|---|---|
| 4 và 5 | 6 không nhỏ hơn 2: giữ | 9, 4, 7, 2, 6 |
| 3 và 4 | 2 nhỏ hơn 7: đổi | 9, 4, 2, 7, 6 |
| 2 và 3 | 2 nhỏ hơn 4: đổi | 9, 2, 4, 7, 6 |
| 1 và 2 | 2 nhỏ hơn 9: đổi | 2, 9, 4, 7, 6 |
Cuối vòng, 2 đã ở đầu. Phần còn lại 9, 4, 7, 6 chưa được coi là đã sắp xếp. Không kết thúc cả thuật toán chỉ vì một số đã về đúng chỗ.
Bài luyện
Sau vòng thứ nhất của ví dụ, dãy nào đúng?
Số 2 được đổi qua các cặp liền kề về đầu dãy.
Đây là kết quả vòng đầu của cách sắp xếp chọn ở bài sau.
Dãy này tương ứng một chiều duyệt khác, không đúng cách đang làm.
Đây là dãy cuối, chưa phải sau vòng đầu.
Lời giải
Cặp cuối 2,6 giữ nguyên; rồi đổi 7,2, đổi 4,2 và đổi 9,2. Kết quả lần lượt dẫn đến 2,9,4,7,6.
Hoàn tất các vòng còn lại
Tiếp tục từ kết quả vòng đầu, luôn so sánh các cặp liền kề từ cuối về đầu phần chưa sắp:
| Sau vòng | Dãy |
|---|---|
| 1 | 2, 9, 4, 7, 6 |
| 2 | 2, 4, 9, 6, 7 |
| 3 | 2, 4, 6, 9, 7 |
| 4 | 2, 4, 6, 7, 9 |
Thực hành bằng năm thẻ số và ghi lại từng lần đổi chỗ. Ở vòng 2 chỉ xét từ cặp vị trí 4–5 đến cặp 2–3, vì vị trí 1 đã đúng. Kết quả cuối phải tăng dần và vẫn có đủ năm giá trị ban đầu, mỗi giá trị giữ đúng số lần xuất hiện.
Nếu cần sắp giảm dần bằng cùng chiều duyệt, đổi điều kiện: hoán đổi khi số phía sau **lớn hơn** số phía trước. Khi đó số lớn nhất của phần chưa sắp được đưa về đầu phần ấy.
Bài luyện
Vì sao vòng 2 không cần so sánh lại cặp vị trí 1–2?
Vị trí thứ hai còn cần được xác định từ phần chưa sắp.
Phần phía sau có thể vẫn chưa đúng thứ tự.
Các vòng tiếp theo vẫn có thể đổi chỗ.
Vòng đầu đã cố định đúng phần tử nhỏ nhất tại đầu dãy.
Lời giải
Vòng đầu đưa số nhỏ nhất về vị trí 1. Vòng sau chỉ cần sắp phần còn lại từ vị trí 2 trở đi, giữ nguyên vị trí đã đúng.
Bài luyện
Khi so sánh hai số liền kề bằng nhau để sắp tăng dần, cách làm của bài thực hiện gì?
Sắp xếp không được làm mất phần tử trùng.
Số phía sau không nhỏ hơn số phía trước nên không đổi.
Thay số làm sai dữ liệu ban đầu.
Sắp xếp chỉ tổ chức lại thứ tự, không sửa giá trị.
Lời giải
Điều kiện hoán đổi là số phía sau nhỏ hơn số phía trước. Khi bằng nhau, điều kiện sai, nên giữ nguyên cả hai giá trị.
Bài luyện
Giữ chiều duyệt từ cuối về đầu nhưng muốn sắp giảm dần. Khi nào hoán đổi hai phần tử liền kề?
Điều kiện này đưa số nhỏ về đầu, phù hợp tăng dần.
Hai số bằng nhau không cần đổi để tạo thứ tự.
Điều kiện này đưa số lớn về đầu phần chưa sắp.
Đổi mọi cặp không bảo đảm đúng thứ tự.
Lời giải
Muốn số lớn đứng trước, khi cặp đang có số sau lớn hơn số trước thì đổi chúng. Lặp từ cuối về đầu đưa số lớn nhất của phần chưa sắp về đầu phần đó.
Đang học