Thu nhỏ phần đầu cần sắp xếp
Cần sắp xếp A[0] tới A[k] theo thứ tự không giảm. Khi k≤0, phần đang xét có không quá một phần tử nên không cần chèn. Khi k>0, trước hết gọi cùng hàm để sắp xếp A[0] tới A[k−1], rồi chèn A[k] vào phần đầu đã có thứ tự.
```python
def sap_xep_chen(A, k):
if k <= 0:
return
sap_xep_chen(A, k - 1)
value = A[k]
j = k - 1
while j >= 0 and A[j] > value:
A[j + 1] = A[j]
j -= 1
A[j + 1] = value
```
Gọi ban đầu sap_xep_chen(A,len(A)−1). Hàm dùng đệ quy cho phần đầu; vòng while vẫn dùng để dời các phần tử lớn hơn value sang phải.
Chèn sau khi phần đầu đã được sắp xếp
Với A=[9,4,7], lời gọi k=2 chờ lời gọi k=1. Sau đó:
| Bước | Dãy sau bước ấy |
|---|---|
| k=0: cơ sở, phần đầu chỉ có 9 | [9,4,7] |
| k=1: chèn 4 vào phần đầu [9] | [4,9,7] |
| k=2: chèn 7 vào phần đầu [4,9] | [4,7,9] |
Ở bước cuối, giữ value=7 trước khi dời 9 sang phải, rồi đặt 7 vào chỗ trống. Hàm **sửa trực tiếp A**, không trả một dãy mới. Với A=[], k=−1 nên kết thúc ngay tại cơ sở.
Chạy cả bộ ví dụ thiết kế đệ quy
Tải mã Python mẫu, mở bằng trình soạn thảo đã dùng và chạy với Python3. Mẫu chọn n từ 0 đến20 để các lời gọi tính trực tiếp nhỏ; đây là giới hạn thử, không phải giới hạn toán học.
Với n=4, cần nhận tổng10, tổng lẻ4, giai thừa24, 3^n=81 và tổng giai thừa33. Dãy mẫu [9,4,7,4] được in ngược thành4,7,4,9, rồi sau sắp xếp thành [4,4,7,9]; tìm 7 trả chỉ số 2. Với n=0, tổng/tổng lẻ/tổng giai thừa bằng 0, giai thừa và 3^n bằng 1. Nhập chữ hoặc n âm phải được báo dữ liệu không phù hợp trước phần tính số.
Khi thử riêng hàm dãy, thêm trường hợp rỗng, một phần tử, đã sắp xếp, thứ tự giảm và phần tử trùng. Kiểm dãy sau sắp xếp và kết quả tìm kiếm, không chỉ nhìn chương trình kết thúc.
Bài luyện
Với A=[9,4,7] và k=2, sau khi lời gọi sap_xep_chen(A,1) hoàn tất nhưng chưa chèn 7, A là gì?
Đó là kết quả sau bước chèn 7 tiếp theo.
Phần đầu [9,4] đã phải được sắp xếp.
Không phải thứ tự không giảm của phần đầu.
Hai phần tử đầu đã được sắp xếp;7 còn chờ chèn.
Lời giải
Lời gọi k=1 sắp xếp riêng phần đầu [9,4] thành [4,9]. Phần tử chỉ số 2 vẫn là7, nên A đang là [4,9,7].
Bài luyện
Gọi sap_xep_chen(A,len(A)-1) với A=[9,4,7]. Sau lời gọi, A là gì?
Hàm sắp xếp không giảm ngay trên dãy A.
Các lệnh gán đã sửa A.
Còn thiếu bước chèn 7 cuối cùng.
Đây là thứ tự giảm, khác yêu cầu.
Lời giải
Phần đầu [9,4] trở thành [4,9]; sau đó7 được chèn trước9. Vì hàm sửa tại chỗ, A sau lời gọi là [4,7,9].
Bài luyện
Vì sao lời gọi sap_xep_chen([], -1) kết thúc mà không truy cập phần tử?
Hàm đã dừng tại nhánh k<=0.
Nhánh cơ sở nằm trước mọi thao tác đọc A[k].
Dãy rỗng không có phần tử tương ứng với chỉ số âm.
Không có lệnh thêm 0 vào dãy.
Lời giải
K=−1 thỏa k<=0 nên return được thực hiện ngay. Các lệnh gọi tiếp, lấy value=A[k] và chèn không chạy; dãy vẫn rỗng.
Đang học