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

Đọc thuật toán đổi chỗ theo từng cặp

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

Đưa giá trị nhỏ về bên trái

Đoạn mã duyệt mọi cặp chỉ số `i < j`. Nếu `a[i] > a[j]`, nó đổi chỗ hai giá trị. Sau khi xét hết các `j > i`, vị trí `i` giữ giá trị nhỏ nhất trong phần dãy đang xét; tiếp tục với `i+1`. Kết quả là dãy **không giảm**, kể cả khi có phần tử bằng nhau. Mã có thể đổi chỗ nhiều lần trong một lượt `i`, vì vậy không gọi nó là đúng cùng cách cài đặt sắp xếp chọn của bài trước, vốn tìm vị trí nhỏ nhất rồi mới đổi chỗ một lần.

Đầu ra và số lần so sánh

```python def sap_theo_cap_va_dem(a): so_sanh = 0 for i in range(len(a) - 1): for j in range(i + 1, len(a)): so_sanh += 1 if a[i] > a[j]: a[i], a[j] = a[j], a[i] return so_sanh a = [3, 1, 2] print(sap_theo_cap_va_dem(a), a) ``` Kết quả là `3 [1, 2, 3]`. Số cặp được xét là `(n−1)+(n−2)+…+1 = n(n−1)/2`, nên bậc thời gian `O(n²)`. Nếu dãy đã tăng sẵn, vẫn xét từng cặp nhưng không đổi chỗ; chi phí đổi chỗ vì thế không cố định cho mọi dữ liệu.

Bài luyện

Với `a = [3, 1, 2]`, sau `sap_theo_cap_va_dem(a)` thì a là gì?
Chọn một đáp án

Bài luyện

Mã trong bài xét bao nhiêu cặp chỉ số khi dãy có 4 phần tử?
Chọn một đáp án

Bài luyện

Điểm khác của mã này so với sắp xếp chọn tìm vị trí nhỏ nhất rồi đổi một lần là gì?
Chọn một đáp án

Đang học