Công nghệ thông tin là một ngành khoa học đang phát triển mạnh mẽ và có nhiều ứng dụng trong tất cả các hoạt động của xã hội, trong vài chục năm trở lại đây công nghệ thông tin đã thâm nhập vào mọi lĩnh vực hoạt động của con người, sự phát triển của công nghệ thông tin đang dẫn đến những thay đổi quan trọng trong cách sống và ngay cả cách suy nghĩ của chúng ta, ngoài sự tò mò, ham hiểu biết mỗi người phải ý thức rằng nếu không có hiểu biết nhất định về máy tính nói riêng và tin học nói chung thì khó có thể hòa nhập vào cuộc sống hiện đại. Vì vậy việc đưa tin học vào giảng dạy trong các trường phổ thông là việc làm rất cần thiết, giúp các em nắm được các kiến thức cơ bản, những lợi ích của tin học để áp dụng vào đời sống và góp phần làm nền tảng kiến thức để học tập cao hơn. Từ thực tế giảng dạy của bản thân tôi nhận thấy việc nắm vững các thuật toán và áp dụng nó một cách linh hoạt trong các bài tập nhất định là không đơn giản, để có thể nhận dạng một bài toán có thể thực hiện với các thuật toán không phải dễ, ngoài ra để cài đặt được thuật toán hiệu quả nhất cũng đòi hỏi người lập trình nắm vững các phương pháp thiết kế thuật toán; đa số học sinh cảm thấy khó khăn sợ khi giải các bài toán tin có liên quan đến thuật toán nâng cao, rất lúng túng trong quá trình phân tích, tổ chức dữ liệu, tìm ra thuật toán hiệu quả; trước hết là thực hiện đổi mới phương pháp giảng dạy Tin học làm cho học sinh tìm ra những kết quả sáng tạo, lời giải hay trên các bài toán, giúp bản thân nắm vững hơn nữa về tư duy thuật toán, khả năng lập trình. Xuất phát từ những lí do trên, tôi xin trình bày một sáng kiến nhỏ trong công tác giảng dạy với đề tài: “SỬ DỤNG THUẬT TOÁN ĐẾM PHÂN PHỐI VÀ THUẬT TOÁN SẮP XẾP NHANH (QUICH SORT) ĐỂ GIẢI MỘT SỐ BÀI TOÁN TIN HỌC’’.
I ĐẶT VẤN ĐỀ: Công nghệ thông tin ngành khoa học phát triển mạnh mẽ có nhiều ứng dụng tất hoạt động xã hội, vài chục năm trở lại công nghệ thông tin thâm nhập vào lĩnh vực hoạt động người, phát triển công nghệ thông tin dẫn đến thay đổi quan trọng cách sống cách suy nghĩ chúng ta, ngồi tò mò, ham hiểu biết người phải ý thức khơng có hiểu biết định máy tính nói riêng tin học nói chung khó hòa nhập vào sống đại Vì việc đưa tin học vào giảng dạy trường phổ thông việc làm cần thiết, giúp em nắm kiến thức bản, lợi ích tin học để áp dụng vào đời sống góp phần làm tảng kiến thức để học tập cao Từ thực tế giảng dạy thân nhận thấy việc nắm vững thuật tốn áp dụng cách linh hoạt tập định khơng đơn giản, để nhận dạng tốn thực với thuật tốn khơng phải dễ, ngồi để cài đặt thuật tốn hiệu đòi hỏi người lập trình nắm vững phương pháp thiết kế thuật toán; đa số học sinh cảm thấy khó khăn sợ giải tốn tin có liên quan đến thuật tốn nâng cao, lúng túng q trình phân tích, tổ chức liệu, tìm thuật tốn hiệu quả; trước hết thực đổi phương pháp giảng dạy Tin học làm cho học sinh tìm kết sáng tạo, lời giải hay toán, giúp thân nắm vững tư thuật tốn, khả lập trình Xuất phát từ lí trên, tơi xin trình bày sáng kiến nhỏ công tác giảng dạy với đề tài: “SỬ DỤNG THUẬT TOÁN ĐẾM PHÂN PHỐI VÀ THUẬT TOÁN SẮP XẾP NHANH (QUICH SORT) ĐỂ GIẢI MỘT SỐ BÀI TOÁN TIN HỌC’’ Trang II GIẢI QUYẾT VẤN ĐỀ: Đề tài: “SỬ DỤNG THUẬT TOÁN ĐẾM PHÂN PHỐI VÀ THUẬT TOÁN SẮP XẾP NHANH (QUICH SORT) ĐỂ GIẢI MỘT SỐ BÀI TOÁN TIN HỌC’’ CƠ SỞ LÝ LUẬN CỦA VẤN ĐỀ: Trong trình giảng dạy lớp trình bồi dưỡng học sinh giỏi tin học 10, 11, 12 mà dạy nhiều năm qua, thấy em học sinh gặp toán yêu cầu ta phải sử dụng đến thuật toán nâng cao để giải như: Các thuật tốn: Đếm, xếp, tìm kiếm, quy hoạch động, đồ thị … Tôi nhận thấy việc nắm vững thuật tốn áp dụng cách linh hoạt tập định không đơn giản, đa số học sinh cảm thấy khó khăn sợ giải tốn có liên quan đến thuật tốn nâng cao; lúng túng q trình phân tích, tổ chức liệu, tìm thuật tốn hiệu quả; trước hết thực đổi phương pháp giảng dạy Tin học làm cho học sinh tìm kết sáng tạo, lời giải hay toán; giúp thân nắm vững tư thuật tốn, khả lập trình, tơi chọn đề tài: “SỬ DỤNG THUẬT TOÁN ĐẾM PHÂN PHỐI VÀ THUẬT TOÁN SẮP XẾP NHANH (QUICH SORT) ĐỂ GIẢI MỘT SỐ BÀI TOÁN TIN HỌC’’ THỰC TRẠNG CỦAVẤN ĐỀ: Khi học lập trình TURBO PASCAL đa số học sinh khó khăn giải tốn phải sử dụng đến thuật tốn nâng cao để có cách giải tối ưu nhất, em lúng túng q trình phân tích tốn, tổ chức liệu, tìm thuật tốn hiệu để lập trình giải toán CÁC BIỆN PHÁP ĐÃ TIẾN HÀNH ĐÊ GIẢI QUYẾT VẤN ĐỀ: Trong ngơn ngữ lập trình, tốn có liên quan đến đếm đối tượng dễ xây dựng thuật tốn cho nó; nhiên, gặp tốn thường u cầu với liệu lớn; không xây dựng thuật tốn tối ưu khó đưa lời giải tốt; để tiếp cận xử lý toán đếm xếp Trang cách nhanh hiệu sử dụng thuật toán Đếm phân phối thuật toán xếp nhanh (Quick sort) Thuật toán 1: Thuật toán đếm phân phối Tư tưởng thuật toán xây dựng dựa suy nghĩ thực tế để đếm số lượng bò vùng xác định người ta phải tìm cách lùa chúng vào chuồng (để chúng khỏi chạy rông) cho dễ đếm Đương nhiên bò loại phải lùa vào chuồng để dễ phân biệt lùa vào chuồng tốt Tương tự vậy, muốn giải toán đếm đối tượng ta dùng cấu trúc liệu hợp lý (sử dụng cấu trúc mảng) với ý nghĩa giống “chuồng” để lưu đối tượng, phần tử mảng tương ứng với chuồng Trên sở ta dễ dàng thực mục đích thực thao tác đếm Để hiểu rõ thuật tốn q trình giảng dạy lớp bồi dưỡng học sinh giỏi đưa toán sau: Xuất phát từ toán: Bài toán đặt giả sử cánh đồng rộng thả nhiều bò (N con), bò đeo thẻ có số hiệu ngun dương (là số tháng tuổi nó) Tất nhiên, hai bò tháng tuổi đeo thẻ có số hiệu Làm để đếm loại bò có nhiều nhất? Bài tốn phát biểu lại sau: + Nhập từ bàn phím số nguyên dương N (0 < N < 500) phần tử mảng chiều A(N) có giá trị nguyên dương (0 < A[i] < 100) + Giá trị xuất nhiều A xuất lần? + Ví dụ: A(16) = {1,2,3,5,4,5,6,5,6,7,1,6,5,5,8,9} A(16) có số phần tử giá trị nhiều Số lượng phần tử Để giải toán người ta dùng thuật toán “đếm phân phối ” Xây dựng thuật toán: + Bước 1: Đóng dãy chuồng bò đánh số chuồng số tự nhiên liên tiếp từ đến max (max số tháng tuổi bò già nhất), ban đầu Trang chuồng chưa có bò + Bước 2: Lùa bò vào chuồng có số hiệu số thẻ + Bước 3: Duyệt dãy chuồng bò tìm chuồng có nhiều bò Áp dụng thuật toán vào tập: Bước 1: Giả sử bò thứ i có tháng tuổi A[i] (1 < i < n) Coi mảng B(n) dãy chuồng bò, B[x] số lượng bò (có x tháng tuổi) chuồng có số hiệu x, ban đầu phần tử mảng B(n) Bước 2: Con bò có tháng tuổi A[i] phải vào chuồng bò có số hiệu A[i] Thêm bò vào chuồng A[i] tương ứng với lệnh Inc(B[A[i]]) Bước 3: Duyệt mảng B, tìm số phần tử lớn Chương trình: Var N: integer; A: array[1 1000] of byte; B: array[1 10000] of byte; slmax, i, csln: integer; BEGIN Write('Nhap vao so nguyen duong N = '); Readln(N); For i := to N Begin Write('A[',i,'] = '); Readln(A[i]); End; {Khởi tạo dãy chuồng bò ban đầu chưa có bò} Fillchar (B, sizeof (B) ,0) ; Trang {Thực lùa bò vào chuồng} For i := to N inc (B [A[i] ] ); slmax := 0; {Duyet day chuong tim chuong co nhieu bo nhat} For i := to max if B[i] > slmax then Begin slmax := B[i]; csln := i; End; Write('So ',csln, ' co tan suat xuat hien nhieu nhat la: ',B[csln]); Readln; END Bài toán 2: Nhập vào số nguyên dương N (2l then quicksort(l,j); if i3 if (a[i]+a[i-1]+a[i-2])l then quicksort(l,j); if i