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

Sắp xếp chọn: đưa số nhỏ nhất về đầu phần còn lại

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

Mỗi lượt cố định thêm một vị trí

Với `[6, 5, 4, 2]`, lượt đầu tìm số nhỏ nhất toàn dãy là 2 rồi đổi với 6: `[2, 5, 4, 6]`. Lượt sau chỉ xét đoạn từ chỉ số 1, chọn 4 rồi đổi với 5: `[2, 4, 5, 6]`. Lượt cuối xét `[5, 6]`, 5 đã ở đầu đoạn nên không cần đổi. Sau lượt chỉ số `i`, phần `a[0]` đến `a[i]` đã đứng đúng vị trí cuối cùng của dãy tăng. Không cần chọn riêng phần tử cuối vì sau các lượt trước nó tự ở đúng chỗ.

Lưu chỉ số nhỏ nhất, không chỉ lưu giá trị

```python def sap_chon_tang(a): n = len(a) for i in range(n - 1): i_nho_nhat = i for j in range(i + 1, n): if a[j] < a[i_nho_nhat]: i_nho_nhat = j if i_nho_nhat != i: a[i], a[i_nho_nhat] = a[i_nho_nhat], a[i] return a print(sap_chon_tang([6, 5, 4, 2])) ``` Kết quả là `[2, 4, 5, 6]`. Biến `i_nho_nhat` là **chỉ số** của số nhỏ nhất tìm được trong đoạn còn lại, nhờ đó biết đổi ô nào với `a[i]`. Nếu đã ở đúng `i`, nhánh `if` bỏ phép đổi với chính nó. Hàm vẫn duyệt để xác định điều đó; với dãy rỗng hoặc một phần tử, vòng ngoài không chạy. Khi các giá trị trùng nhau, mã vẫn sắp theo giá trị nhưng không hứa giữ thứ tự ban đầu của các bản ghi có cùng giá trị.

Bài luyện

Sắp xếp chọn tăng dãy `[6,5,4,2]`: sau lượt đầu, dãy là gì?
Chọn một đáp án

Bài luyện

Sau lượt với `i=1` của sắp xếp chọn tăng, phần nào đã đứng đúng vị trí cuối cùng?
Chọn một đáp án

Bài luyện

Biến `i_nho_nhat` trong chương trình lưu gì?
Chọn một đáp án

Đang học