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

Đặt ba cách sắp xếp vào một thư viện

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

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?
Chọn một đáp án

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`?
Chọn một đáp án

Bài luyện

Với dãy `[5, 2, 8, 2]`, cả ba hàm sắp tăng phải cho gì?
Chọn một đáp án

Đang học