Tệp hàm và tệp sử dụng có vai trò khác nhau
Có thể tạo thư viện gồm hàm nhập dãy số và ba thuật toán sắp đã học. Đặt các hàm dưới đây trong tệp `sapxep.py`; tệp `main.py` ở **cùng thư mục** nhập thư viện đó. Mỗi cách sắp sửa dãy truyền vào, nên khi so sánh ba thuật toán phải tạo ba bản dãy riêng. Với `5 2 8 2`, cả ba đều phải cho `[2, 2, 5, 8]`. Tên `sapxep.py` do người viết chọn; tránh trùng tên thư viện chuẩn như `math.py` để không che thư viện cần dùng.
Nội dung tệp sapxep.py
```python
def doc_day(chuoi):
return [int(x) for x in chuoi.split()]
def sap_chen(A):
for i in range(1, len(A)):
gia_tri = A[i]
j = i - 1
while j >= 0 and A[j] > gia_tri:
A[j + 1] = A[j]
j -= 1
A[j + 1] = gia_tri
def sap_chon(A):
for i in range(len(A) - 1):
vi_tri = i
for j in range(i + 1, len(A)):
if A[j] < A[vi_tri]:
vi_tri = j
A[i], A[vi_tri] = A[vi_tri], A[i]
def sap_noi_bot(A):
for i in range(len(A) - 1):
for j in range(len(A) - 1 - i):
if A[j] > A[j + 1]:
A[j], A[j + 1] = A[j + 1], A[j]
```
Trong `main.py` có thể viết `import sapxep as sx`, gọi `A = sx.doc_day(input("Nhập dãy: "))`, rồi `sx.sap_chen(A)` và `print(A)`. Muốn kiểm ba cách trên cùng đầu vào mà không nhập ba lần, gán `B = A.copy()` và `C = A.copy()` **trước** khi sắp A, sau đó lần lượt sắp B và C. Trong vòng trong của sắp chèn, chỉ số `j` đi lùi qua phần đã sắp, nên phải so `A[j] > gia_tri`. So `A[i]` sẽ không dịch được phần tử vì `A[i]` ban đầu chính là `gia_tri`.
Bài luyện
Vì sao cần `B = A.copy()` trước khi thử cách sắp thứ hai?
Các hàm sửa dãy tại chỗ, nên bản sao giữ dữ liệu thử riêng.
copy không đảo dãy.
copy giữ nguyên phần tử trùng.
Vẫn cần import mô-đun.
Lời giải
Nếu sắp trực tiếp A rồi đưa A cho hàm tiếp theo, hàm sau nhận dãy đã sắp; tạo bản sao trước giúp so sánh trên cùng đầu vào.
Bài luyện
Trong vòng trong của sắp chèn, phải so phần tử nào với `gia_tri`?
j đi lùi qua đoạn đã sắp để tìm vị trí chèn.
A[i] ban đầu là gia_tri nên so không làm dịch.
Không phải lúc nào cũng xét phần tử đầu.
Độ dài không là phần tử cần so.
Lời giải
Sắp chèn duyệt ngược các phần tử đã sắp bằng chỉ số j, nên điều kiện dịch là A[j] > gia_tri.
Bài luyện
Với dãy `[5, 2, 8, 2]`, cả ba hàm sắp tăng phải cho gì?
Giữ đủ bốn phần tử, kể cả hai số 2, theo thứ tự không giảm.
Đây là giảm.
Thiếu một số 2.
Dãy chưa sắp.
Lời giải
Sắp tăng không giảm giữ các giá trị 2,2,5,8; ba thuật toán khác cách làm nhưng cùng kết quả.
Đang học