Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 39 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
39
Dung lượng
256,21 KB
Nội dung
SỞ GIÁO DỤC VÀ ĐÀO TẠO NGHỆ AN SÁNG KIẾN KINH NGHIỆM ĐỀ TÀI PHÂN TÍCH, VẬN DỤNG CÁC THUẬT TOÁN SẮP XẾP ĐỂ GIẢI QUYẾT MỘT SỐ BÀI TOÁN VIẾT BẰNG NNLT C++ SKKN thuộc lĩnh vực: Tin học Nghệ An năm 2021 MỞ ĐẦU 1.1 Lý chọn đề tài Chúng ta biết để có kết cao kì thi tuyển chọn học sinh giỏi mơn tin học nói chung phải có vốn kiến thức thuật toán để giải toán khó, tốn liệu vào lớn, sau học sinh lựa chọn NNLT để lập trình dựa vào thuật tốn tìm giải tốn theo yêu cầu Trong trình dạy bồi dưỡng học sinh giỏi tơi gặp nhiều tốn có sử dụng giải thuật xếp Đây dạng tập khơng khó học sinh thường hay chủ quan nên không chạy hết test lớn Nguyên nhân học sinh không áp dụng phương pháp phù hợp cho tốn Với mong muốn giúp học sinh giải tốt tập xếp dãy số, dày công nghiên cứu thuật tốn xếp phân tích để áp dụng vào dạng tốn phù hợp Mặt khác, theo chương trình Bộ Giáo Dục khuyến khích giáo viên dạy NNLT thay Pascal nên tơi viết chương trình NNLT C++ để làm tài liệu tham khảo cho giáo viên học sinh Từ lý tơi mạnh dạn trình bày sáng kiến kinh nghiệm: “Phân tích, vận dụng thuật tốn xếp để giải số toán viết NNLT C++” 1.2 Mục đích nghiên cứu Mục đích sáng kiến nghiên cứu, phân tích vận dụng thuật toán xếp dành cho đối tượng HSG khối THPT Việc lĩnh hội sáng kiến giúp học sinh: - Mô tả khái niệm, chất mục đích việc xếp - Trình bày thực cài đặt cách xác thuật toán xếp - Đánh giá thuật tốn xếp tìm thuật tốn xếp phù hợp cho toán - Giúp em học giỏi môn Tin Học đạt kết cao - Tạo nguồn tài liệu tham khảo thuật toán hỗ trợ cho học sinh, giáo viên dạy Tin học bậc THPT - Sử dụng NNLT C++ chương trình giáo dục phổ thông 1.3 Đối tượng nghiên cứu Sáng kiến kinh nghiệm có đối tượng nghiên cứu thuật toán xếp viết số chương trình có sử dụng thuật tốn xếp NNLT C++ 1.4 Phương pháp nghiên cứu Để trình bày sáng kiến kinh nghiệm này, sử dụng phối kết hợp nhiều phương pháp như: nghiên cứu tài liệu, thuyết trình, quan sát, điều tra bản, thực nghiệm so sánh, phân tích kết thực nghiệm, vận dụng… phù hợp với môn học thuộc lĩnh vực Tin học NỘI DUNG NGHIÊN CỨU 2.1 Cơ sở lý luận Nếu học sinh thực tốt việc lựa chọn cài đặt chương trình tối ưu giải tốn xếp nói riêng tập lập trình nói chung chất lượng học sinh giỏi nâng cao Học sinh dần làm quen với NNLT C++ 2.2 Thực trạng 2.2.1 Thực trạng trước nghiên cứu Đối với thi học sinh giỏi, dù kết output thí sinh có giống hệt với input, việc chênh lệch thời gian định thí sinh chiến thắng hay thất bại (yêu cầu thời gian xử lí chương trình khơng q giây/1 test) Lý vận dụng thuật tốn thường học sinh chọn thuật tốn quen thuộc mà phân tích tốn để tìm thuật tốn phù hợp Vấn đề đặt ra, làm để lấy điểm với input có liệu lớn Muốn cần phải lựa chọn cài đặt chương trình hiệu (tối ưu) Chương trình hiệu chương trình giải input có liệu lớn, xác, dung lượng sử dụng nhớ nhỏ, thời gian thực chương trình ngắn, 2.3 Các biện pháp sử dụng để giải vấn đề 2.3.1 Giới thiệu toán xếp 2.3.1.1 Khái niệm Sắp xếp trình xử lý danh sách phần tử (hoặc mẫu tin) để đặt chúng theo thứ tự, thỏa mãn tiêu chuẩn dựa nội dung thơng tin lưu trữ phần tử Ví dụ: cho trước dãy số a1, a2, , an lưu trữ cấu trúc liệu mảng Sắp xếp dãy số a1, a2, , an thực việc bố trí lại phần tử cho dãy có thứ tự tăng dần (hoặc giảm dần) Hai thao tác so sánh gán thao tác hầu hết thuật toán xếp Bài toán xếp xuất lĩnh vực tin học Khi xây dựng toán xếp, cần tìm cách giảm thiểu phép so sánh đổi chỗ không cần thiết để tăng hiệu thuật tốn Trong đề tài tơi giới thiệu số giải thuật xếp từ đơn giản đến phức tạp áp dụng thích hợp cho việc xếp 2.3.1.2 Mục đích xếp Mục đích việc xếp giúp có nhìn tổng quan liệu mà ta có, dễ dàng tìm kiếm phần tử đứng thứ tiêu chí 2.3.2 Một thuật toán xếp 2.3.1.1 Sắp xếp bọt (Bubble Sort) 2.3.1.1.1 Ý tưởng thuật toán Sắp xếp bọt thuật toán đơn giản nhất, ý tưởng thuật toán sau: Duyệt qua danh sách, làm cho phần tử lớn nhỏ cuối danh sách, tiếp tục làm phần tử lớn nhỏ cận kề dịch chuyển cuối hết danh sách 2.3.1.1.2 Nội dung cài đặt chương trình Các bước thực giải thuật: Gán i Gán j Nếu A[j] > A[j+1] đổi chỗ A[j] A[j+1] Nếu j < n-j-1: 4.1: Đúng j=j+1 quay lại bước 4.2: Sai sang bước 5 Nếu i < n-1: 5.1: Đúng i=i+1 quay lại Bước 5.2: Sai dừng lại Cài đặt C++: #include #include #include using namespace std; int a[100001]; int n,tg; int main() { clock_t begin=clock(); ifstream fi("bubble.inp"); ofstream fo("bubble.out"); fi>>n; for (int i=0;i>a[i]; for (int i=0;i