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

Lập luận tính đúng của sắp xếp chèn

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

Sau mỗi lượt, phần đầu đã đúng thứ tự

Sắp xếp chèn lấy phần tử tiếp theo rồi đưa nó vào phần đầu đã sắp. Mệnh đề cần giữ là: **trước lượt có chỉ số `i`, đoạn `a[0:i]` đã sắp không giảm và vẫn chứa đúng các phần tử ban đầu của đoạn ấy**. Ban đầu, đoạn chỉ có một phần tử nên mệnh đề đúng. Sau khi chèn `a[i]` vào vị trí thích hợp, đoạn dài thêm một phần tử vẫn không giảm và không mất phần tử nào. Khi đã xử lí đến cuối dãy, cả dãy được sắp. “Không giảm” nghĩa là phần tử sau **lớn hơn hoặc bằng** phần tử trước. Điều này cho phép hai giá trị bằng nhau, như `[2, 2, 5]`. Chỉ nói các phần tử tăng nghiêm ngặt sẽ bỏ sót trường hợp ấy.

Chèn phần tử 2 vào phần đầu

Với `a = [1, 4, 2]`, trước lượt `i = 2`, phần đầu `[1, 4]` đã sắp. Giữ `value = 2`, dịch `4` sang phải, dừng ở `1` vì `1 <= 2`, rồi đặt `2` vào giữa. Kết quả là `[1, 2, 4]`. Mã dùng điều kiện `a[j] > value` nên không dịch phần tử bằng `value`: ```python def sap_chen(a): for i in range(1, len(a)): value = a[i] j = i - 1 while j >= 0 and a[j] > value: a[j + 1] = a[j] j -= 1 a[j + 1] = value ``` Phần đầu đã sắp là điều kiện dùng cho **mọi lượt**; một vài dãy thử chỉ minh họa, không tự chứng minh mệnh đề.

Bài luyện

Trước lượt `i` của sắp xếp chèn, đoạn nào đã được sắp theo bất biến?
Chọn một đáp án

Bài luyện

Với `a = [1, 4, 2]`, sau khi chèn phần tử cuối bằng mã trong bài, dãy là gì?
Chọn một đáp án

Bài luyện

Vì sao phát biểu “dãy sau sắp tăng nghiêm ngặt” không phù hợp cho đầu vào `[2, 2, 5]`?
Chọn một đáp án

Đang học