btvn.vn
Tìm kiếm Đăng nhập

Sắp xếp nổi bọt: so sánh và đổi chỗ

Lưu trên thiết bị này
Kĩ thuật lập trình — CS · Chọn bài khác

Vòng trong ngắn dần

Ở phiên bản nổi bọt không dừng sớm của SGK, lượt ngoài đầu so sánh `n−1` cặp kề nhau; lượt sau `n−2` cặp; tiếp tục đến 1 cặp. Tổng số so sánh là `n(n−1)/2`, nên bậc thời gian là `O(n²)`. Mỗi lần hai phần tử sai thứ tự mới đổi chỗ. Vì vậy số lần đổi chỗ **phụ thuộc dãy đầu vào**: dãy đã tăng có thể không đổi chỗ lần nào, dù vòng lặp vẫn so sánh đủ các cặp.

Đếm riêng hai loại thao tác

```python def noi_bot_va_dem(a): so_sanh = 0 doi_cho = 0 n = len(a) for i in range(n - 1): for j in range(n - 1 - i): so_sanh += 1 if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] doi_cho += 1 return so_sanh, doi_cho day = [3, 1, 2] print(noi_bot_va_dem(day), day) ``` Kết quả là `(3, 2) [1, 2, 3]`: ba so sánh, hai lần đổi chỗ. Với `[1, 2, 3]`, vẫn có ba so sánh nhưng không đổi chỗ. Do đó công thức giả định **mọi lần so sánh đều đổi chỗ** chỉ là một cách chặn trên chi phí, không phải số thao tác thực tế của mọi dãy.

Bài luyện

Phiên bản nổi bọt trong bài so sánh bao nhiêu cặp khi `n = 4`?
Chọn một đáp án

Bài luyện

Với `a = [1, 2, 3]`, `noi_bot_va_dem(a)` trả cặp số đếm nào?
Chọn một đáp án

Bài luyện

Điều gì có thể đổi theo dữ liệu đầu vào dù độ dài dãy giữ nguyên?
Chọn một đáp án

Đang học