Câu hỏi:
13/07/2024 1,950Bài toán sắp xếp: Cho trước một dãy số A, viết chương trình sắp xếp dãy số này theo thứ tự tăng dần.
Giả sử chúng ta sẽ áp dụng thuật toán sắp xếp chèn để cài đặt cho chương trình này. Ý tưởng của thuật toán này như sau: Sẽ duyệt từng phần tử của dãy A, tính từ vị trí thứ 2 trở đi. Với mỗi phần tử (giả sử A[k]), sẽ tìm cách chèn phần tử này vào đúng vị trí của dãy con phía trước A[0], [1], ..., A[k-1] sao cho dãy con này được sắp xếp đúng. Sau khi duyệt xong các phần tử của dãy thì dãy gốc đã được sắp xếp xong.
Với mỗi phần tử A[k], việc chèn vào vị trí đúng trong dãy con phía trước được thực hiện bằng một vòng lặp như sau:
j = k – 1
while j > 0 and A[j] > A[j+1]:
A[j], A[j+1] = A[j+1],A[j]
j = j – 1
Để tìm lỗi chương trình trên chúng ta áp dụng công cụ printine, in các giá trị trung gian. Với mỗi vòng lặp chính (vòng lặp for k in range(1,n)), chúng ta sẽ in ra các giá trị sau: k, A[k] và kết quả dãy A.
Chương trình được viết như sau, sau khi bổ sung các lệnh in phần tử trung gian.
dayA = [5,1,8,4,2] # Dãy gốc cần sắp xếp
def sap_xep (A):
n = len(A)
for k in range(1,n):
print("vòng" ,k, "số đang xét:", A[k], end = " ")
j = k - 1
while j > 0 and A[j] > A[j+1]:
A[j], A[j+1] = A[j+1], A[j]
j = j - 1
print(A)
print("Dãy gốc:",dayA)
A = dayA. copy()
sap_xep (A)
print("Dãy đích:",A)
Em hãy viết lại chương trình trên và tiến hành kiểm thử xem chương trình có lỗi không? Nếu có thì tìm ra lỗi và sửa lại cho chương trình chạy đúng.
Sách mới 2k7: Tổng ôn Toán, Lí, Hóa, Văn, Sử, Địa…. kỳ thi tốt nghiệp THPT Quốc gia 2025, đánh giá năng lực (chỉ từ 110k).
Quảng cáo
Trả lời:
Các em tự viết lại chương trình trên:
Kết quả chạy chương trình có thể như sau:
Nhận xét: tại mỗi vòng lặp, các giá trị A[k] cũng đã được di chuyển để được chèn vào một vị trí trong dãy con A[0], A[1], ..., A[k-1], tuy nhiên vị trí A[0] không bị thay đổi. Từ đó chúng ta tìm ra lỗi của chương trình tại vị trí lệnh while:
while j > 0 and A[j] > A[j+1]:
Cần sửa lại như sau:
while j >= 0 and A[j] > A[j+1]:
Chương trình đã tìm ra lỗi nhờ công cụ kiểm thử printine. Chương trình chính thức sau khi sửa như sau.
sap_xep.py
dayA = [5,1,8,4,2] # Dãy gốc cần sắp xếp
def sap_xep(A):
n = len(A)
for k in range (1,n):
j = k – 1
while j >= 0 and A[j] > A[j+1]:
A[j], A[j+1] = A[j+1], A[j]
j = j – 1
A = dayA. copy()
sap_xep (A)
print("Dãy đích:", A)
CÂU HỎI HOT CÙNG CHỦ ĐỀ
Câu 1:
Viết chương trình yêu cầu nhập số thực dương a. Chương trình cần kiểm soát lỗi nhập dữ liệu như sau:
Nếu số đã nhập nhỏ hơn hoặc bằng 0 thì thông báo: Nhập sai, số a phải lớn hơn 0. Hãy nhập lại.
Chương trình cần kiểm soát lỗi nhập cho đến khi nào nhập đúng thì thôi.
Câu 2:
Viết chương trình in bảng cửu chương ra màn hình. Yêu cầu bảng cửu chương in ra thành 10 khối bao gồm 2 hàng, 5 cột như sau:
Câu 3:
Em hãy viết chương trình nhập số tự nhiên n, sau đó nhập n họ tên đầy đủ học sinh trong lớp. Khi kết thúc sẽ in ra danh sách học sinh với 2 cột, cột 1 là tên, cột 2 là họ đệm của học sinh này.
Câu 4:
Cho trước dãy số bất kì A. Em hãy viết chương trình tìm và chỉ ra vị trí đầu tiên của dãy A mà 3 số hạng liên tiếp có giá trị là 1, 2, 3 (có thể tổng quát 3 số bất kì p, q, s). Nếu tìm thấy thì thông báo vị trí tìm thấy, nếu không thì thông báo "không tìm thấy mẫu".
Câu 5:
Em hãy viết chương trình nhập hai số tự nhiên Y1, Y2 là số năm, Y2 > Y1. Tính xem trong khoảng thời gian từ năm Y1 đến năm Y2 có bao nhiêu năm nhuận. Áp dụng tính xem trong thế kỉ XXI có bao nhiêu năm nhuận.
Câu 6:
Em hãy viết chương trình nhập số tự nhiên n > 1, sau đó in ra tất cả các ước số nguyên tố khác nhau của n theo hàng ngang trên màn hình. Ví dụ:
- Nếu n = 10 thì in ra 2 5.
- Nếu n = 12 thì in ra 2 3.
về câu hỏi!