skkn một số phương pháp sắp xếp trong chương trình tin học phổ thông

21 297 0
skkn một số phương pháp sắp xếp trong chương trình tin học phổ thông

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT HOẰNG HÓA SÁNG KIẾN KINH NGHIỆM TÊN ĐỀ TÀI MỘT SỐ PHƯƠNG PHÁP SẮP XẾP TRONG CHƯƠNG TRÌNH TIN HOC PHỔ THÔNG Người thực hiện: TRƯƠNG THỊ QUÝ Chức vụ: Giáo viên Đơn vị công tác: Trường THPT HOẰNG HÓA2 SKKN thuộc môn: Tin học THANH HOÁ NĂM 2016 Sáng kiến kinh nghiệm MỤC LỤC A PHẦN MỞ ĐẦU………………………………………………… ………….2 I LÝ DO CHỌN ĐỀ TÀI .2 II MỤC ĐÍCH NGHIÊN CỨU III ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU .2 1.Đối tượng 2 Phạm vi IV NHIỆM VỤ VÀ PHƯƠNG PHÁP NGHIÊN CỨU: B PHẦN NỘI DUNG I CƠ SỞ LÝ LUẬN Đánh giá thực trạng II TỔNG QUAN II.1.THỜI GIAN THỰC HIỆN CHƯƠNG TRÌNH II.1.1 Ðơn vị đo thời gian thực hiện……………………………… II.1.2 Thời gian thực trường hợp xấu nhất………………5 III CÁC PHƯƠNG PHÁP SẮP XẾP ĐƠN GIẢN…………………………… III.1 Sắp xếp chọn (SelectionSort)……………………………………….6 III.2 Sắp xếp chèn (InsertionSort)……………………………………… III.3 Sắp xếp bọt (Bubble Sort)……………………………………….8 III.4 Sắp xếp nhanh (QUICKSORT)………………………………………9 III.5 Sắp xếp đếm phân phối (Distribution Counting)…………… 13 IV MỘT SỐ VÍ DỤ VỀ THUẬT TOÁN SẮP SẾP……………………………14 V HIỆU QUẢ CỦA ĐỀ TÀI:………………………………………………… 18 PHẦN C: KẾT LUẬN……………………………………………… 19 I KẾT LUẬN ………………………………………………………………… 19 II NHỮNG KIẾN NGHỊ LÀM TĂNG TÍNH KHẢ THI CỦA ĐỀ TÀI……….19 III Tài liệu tham khảo: ………………………………………………………….20 GV: Trương Thị Quý – Trường THPT Hoằng Hóa 2 Sáng kiến kinh nghiệm A PHẦN MỞ ĐẦU I LÝ DO CHỌN ĐỀ TÀI: Năm học 2015 -2016 năm tổ chuyên môn phân công dạy Tin học 11 đứng ôn đội tuyển học sinh giỏi môn Tin học Đứng trước nhiệm vụ năm học này, lên kế hoạch mục tiêu dạy học cho nhằm đạt hiệu dạy học tôt đạt tiêu đăng kí Và ôn thi học sinh giỏi học sinh thấy có nhiều thuật toán sếp nên sử dụng thuật toán thuật toán tối ưu phù hợp với toán Trong trình giảng dạy, nhận thấy việc lựa chọn thuật toán xếp học sinh lúng túng chưa để ý đến thời gian nhớ thực chương trình Mặt khác việc giới thiệu thuật toán xếp sách giáo khoa Tin học 11 hạn chế việc thể nhấn mạnh thuật toán xếp Từ thực tế mạnh dạn chon đề tài “ Một số phương pháp xếp chương trình Tin học phổ thông” II MỤC ĐÍCH NGHIÊN CỨU: Đề tài xây dựng phương pháp xếp thành hệ thống học sinh biết cách nhận biết lựa chọn phương pháp cách tổng quát thông qua tiêu chí Từ áp dụng giải nhanh tập ôn tập vận dụng để giải toán kiểm tra đánh giá, ôn thi học sinh giỏi Nhằm nâng cao nghiệp vụ công tác thân nâng cao chất lượng học sinh, giúp học sinh có hứng thú trình học tập ôn thi học sinh giỏi III ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU: Đối tượng Đối tượng nghiên cứu học sinh lớp 11 học sinh đội tuyển học sinh giỏi GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm Phạm vi Phạm vi nghiên cứu nội dung – Bài toán thuật toán, số toán xếp, thuật toán xếp chương trình Tin học 10 để nắm vững kiến thức cho em học sinh lớp 11 kiểm tra đánh giá ôn thi học sinh giỏi IV NHIỆM VỤ VÀ PHƯƠNG PHÁP NGHIÊN CỨU: Để tìm hiểu cách dạy học đạt kết cao việc giới thiệu số phương pháp xếp, thân vận dụng sáng tạo sở lí luận với thực tiễn dạy học Các kiến thức kinh nghiệm dạy học trực tiếp tiến hành giảng dạy lớp, ôn luyện thi học sinh giỏi từ năm 2009 tới Sáng kiến kinh nghiệm trình bày dựa theo luận khoa học hướng đối tượng, cụ thể: thuyết trình, quan sát, điều tra bản, phân tích kết thực nghiệm sư phạm,v.v… phù hợp với học môn học thuộc lĩnh vực cấu trúc liệu GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm B PHẦN NỘI DUNG I CƠ SỞ LÝ LUẬN Đánh giá thực trạng : - Phần lớn học sinh nhận thấy vai trò thuật toán xếp Nhưng thuật toán mà em biết hạn hẹp chương trình sách giáo khoa Tin học 11 Do để giải hầu hết toán đơn giản liên quan đến thuật toán xếp khó khăn - Mặt khác em học sinh có linh hoạt sử dụng phương pháp xếp chương trình phổ thông đảm bảo mặt kết quả, đảm bảo thời gian chạy chương trình cho test giây đa số học sinh chưa giải - Do nên đề tài đưa thuật toán xếp để học sinh nắm sử dụng linh hoạt đồng thời cho học sinh thấy thời gian chạy chương trình mà áp dụng với toán có số liệu lớn, nhỏ khác II TỔNG QUAN II.1.THỜI GIAN THỰC HIỆN CHƯƠNG TRÌNH Thời gian thực chương trình hàm kích thước liệu vào, ký hiệu T(n) n kích thước (độ lớn) liệu vào Ví dụ 1-1: Chương trình tính tổng n số có thời gian thực T(n) = cn c số Thời gian thực chương trình hàm không âm, tức T(n) ≥ 0, ∀ n ≥ II.1.1 Ðơn vị đo thời gian thực Ðơn vị T(n) đơn vị đo thời gian bình thường giờ, phút giây mà thường xác định số lệnh thực máy tính lý tưởng Ví dụ 1-2: Khi ta nói thời gian thực chương trình T(n) = Cn có nghĩa chương trình cần Cn thị thực thi GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm II.1.2 Thời gian thực trường hợp xấu Nói chung thời gian thực chương trình không phụ thuộc vào kích thước mà phụ thuộc vào tính chất liệu vào Nghĩa liệu vào có kích thước thời gian thực chương trình khác Chẳng hạn chương trình xếp dãy số nguyên tăng dần, ta cho vào dãy có thứ tự thời gian thực khác với ta cho vào dãy chưa có thứ tự, ta cho vào dãy có thứ tự tăng thời gian thực khác so với ta cho vào dãy có thứ tự giảm Vì thường ta coi T(n) thời gian thực chương trình trường hợp xấu liệu vào có kích thước n, tức là: T(n) thời gian lớn để thực chương trình liệu vào có kích thước n II.2 CÁCH SẮP XẾP DỮ LIỆU VÀ NGÔN NGỮ SỬ DỤNG Danh sách đối tượng cần xếp mảng lưu trữ kiểu liệu có quan hệ thứ tự (như kiểu số nguyên, số thực, …) Mục đích việc xếp tổ chức lại phần tử mảng cho chúng thứ tự tương ứng với quy luật xếp Ðể trình bày ví dụ minh họa dùng PASCAL làm ngôn ngữ thể sử dụng khai báo sau: CONST N = 10; Var a: array[1 N]of integer; Procedure hd(var x,y:integer); Var tg:integer; Begin tg:=x; x:=y; y:=tg; End; Cần thấy thủ tục hd lấy O(1) thời gian thực lệnh gán nối tiếp GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm III CÁC PHƯƠNG PHÁP SẮP XẾP ĐƠN GIẢN III.1 Sắp xếp chọn (SelectionSort) a) Phương pháp: Ðây phương pháp xếp đơn giản tiến hành sau: • Ðầu tiên chọn phần tử có giá trị nhỏ n phần tử từ a[1] đến a[n] hoán vị với phần tử a[1] • Chọn phần tử có giá trị nhỏ n-1phần tử từ a[2] đến a[n] hoán vị với a[2] • Tổng quát bước thứ i, chọn phần tử có giá trị nhỏ n-i+1 phần tử từ a[i] đến a[n] hoán vị với a[i] • Sau n-1 bước mảng xếp Phương pháp gọi phương pháp chọn lặp lại trình chọn phần tử nhỏ số phần tử chưa b) Chương trình: PROCEDURE SelectionSort; VAR T,i,j,y: integer; BEGIN {1} FOR i := TO n-1 DO BEGIN {2} T := a[i]; {3} FOR j := i+1 TO n DO {4} IF a[j] < T THEN BEGIN {5} T := a[j]; {6} y := j; END; {7} hd(a[i],a[y]); END; END; c) Đánh giá: Trước hết ta có thủ tục hd thời gian nói mục Các lệnh {2} lấy O(1) thời gian Vòng lặp for {3} – {6} thực n-i lần, GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm j chạy từ i+1 đến n, lần lấy O(1), nên lấy O(n-i) thời gian Do thời gian tổng cộng là: n(n − 1) T(n) = tức O(n2) III.2 Sắp xếp chèn (InsertionSort) a) Phương pháp: Trước hết ta xem phần tử a[1] dãy có thứ tự • Bước 1, xen phần tử a[2] vào danh sách có thứ tự a[1] cho a[1], a[2] danh sách có thứ tự • Bước 2, xen phần tử a[3] vào danh sách có thứ tự a[1], a[2] cho a[1], a[2], a[3] danh sách có thứ tự •Tổng quát, bước i, xen phần tử a[i+1] vào danh sách có thứ tự a[1],a[2], a[i] cho a[1], a[2], a[i+1] danh sách có thứ tự • Phần tử xét a[j] xen vào vị trí thích hợp danh sách phần tử trước a[1],a[2], a[j-1] cách so sánh giá trị a[j] với giá trị a[j-1] đứng trước Nếu giá trị a[j] nhỏ giá trị a[j-1] hoán đổi a[j-1] a[j] cho tiếp tục so sánh giá trị a[j-1] (lúc a[j1] chứa nội dung a[j]) với giá trị a[j-2] đứng trước b) Chương trình: PROCEDURE InsertionSort; VAR i,j: integer; BEGIN {1} FOR i := TO n DO BEGIN {2} J := i; {3} WHILE (j>1) AND (a[j] < a[j-1]) DO BEGIN {4} hd(a[j], a[j-1]); {5} j := j-1; END; END; END; GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm c) Đánh giá: Ta thấy lệnh {4} {5} lấy O(1) Vòng lặp {3} chạy nhiều i-1 lần, lần tốn O(1) nên {3} lấy i-1 thời gian Lệnh {2} {3} hai lệnh nối tiếp nhau, lệnh {2} lấy O(1) nên hai lệnh lấy i-1 Vòng lặp {1} có i chạy từ đến n nên gọi T(n) thời gian để n phần tử ta có: n(n − 1) T(n) = tức O(n2) III.3 Sắp xếp bọt (Bubble Sort) a) Phương pháp: Chúng ta tưởng tượng phần tử lưu mảng dọc, qua trình sắp, phần tử có giá trị “nhẹ” lên Chúng ta duyệt toàn mảng, từ lên Nếu hai phần tử cạnh mà không thứ tự tức phần tử “nhẹ hơn” lại nằm phải cho “nổi lên” cách đổi chỗ hai phần tử cho Cụ thể là: • Bước 1: Xét phần tử từ a[n] đến a[2], với phần tử a[j], so sánh giá trị với giá trị phần tử a[j-1] đứng trước Nếu giá trị a[j] nhỏ giá trị a[j-1] hoán đổi a[j] a[j-1] cho • Bước 2: Xét phần tử từ a[n] đến a[3], làm tương tự • Sau n-1 bước kết thúc b) Chương trình: PROCEDURE BubbleSort; VAR i,j: integer; BEGIN {1} FOR i := to n-1 DO {2} {3} {4} FOR j := n DOWNTO i+1 DO IF a[j] < a[j-1] THEN hd(a[j],a[j-1]); GV: Trương Thị Quý – Trường THPT Hoằng Hóa Sáng kiến kinh nghiệm END; c) Đánh giá: Dòng lệnh {3} lấy thời gian Vòng lặp {2} thực (n-i) bước, bước lấy O(1) nên lấy O(n-i) thời gian Như toàn chương trình ta có: n(n − 1) T(n) = tức O(n2) Một thuật toán có thời gian thực O(n2) là: for i:=1 to n-1 for j:=i+1 to n if a[i]>a[j] then hd(a[i],a[j]) end; III.4 Sắp xếp nhanh (QUICKSORT) a Phương pháp: Chúng ta xét mảng a phần tử a[1] a[n] Giả sử v giá trị mà ta gọi chốt (pivot) Ta phân hoạch dãy a[1] a[n] thành hai mảng "bên trái" "bên phải" Mảng "bên trái" bao gồm phần tử có giá trị nhỏ chốt, mảng "bên phải" bao gồm phần tử có giá trị lớn chốt Sắp xếp mảng “bên trái” mảng “bên phải” mảng cho tất giá trị mảng “bên trái“ nhỏ giá trị mảngcon “bên phải” Việc xếp mảng “bên trái” “bên phải” tiến hành phương pháp nói Một mảng gồm phần tử gồm nhiều phần tử có giá trị có thứ tự Chọn giá trị lớn hai phần tử có giá trị khác kể từ trái qua Nếu mảng gồm phần tử hay gồm nhiều phần tử có giá trị chốt GV: Trương Thị Quý – Trường THPT Hoằng Hóa 10 Sáng kiến kinh nghiệm Ðể phân hoạch mảng ta dùng "con nháy" L R L từ bên trái R từ bên phải, ta cho L chạy sang phải gặp phần tử có giá trị ≥ chốt cho R chạy sang trái gặp phần tử có giá trị < chốt Tại chỗ dừng L R L < R hoán vị a[L], a[R] Lặp lại trình dịch sang phải, sang trái "con nháy" L R L > R Khi L điểm phân hoạch, cụ thể a[L] phần tử mảng “bên phải” b) Chương trình: FUNCTION Findch(i,j:integer): integer; VAR c,k : integer; BEGIN {1} k := i+1; {2} c := a[i]; {3} WHILE (k j THEN Fidch := ELSE {5}IF a[k] > c THEN Findch := k ELSE Findch := i; END; Trong hàm Findch lệnh {1}, {2}, {3} {4} nối tiếp nhau, có lệnh WHILE tốn nhiều thời gian thời gian thực hàm Findch phụ thuộc vào thời gian thực lệnh Trong trường hợp xấu (không tìm thấy chốt) k chạy từ i+1 đến j, tức vòng lặp thực j-i lần, lần O(1) tốn j-i thời gian Đặc biệt i=1 j=n, thời gian thực n-1 hay T(n) = O(n) Hàm Phanhoach nhận vào ba tham số i, j chốt để thực việc phân hoạch mảng a[i] a[j] theo chốt trả giá trị L số mảng “bên phải” Hai nháy L, R sử dụng để thực việc phân hoạch trình bày FUNCTION Phanhoach(i,j,c:integer):integer ; GV: Trương Thị Quý – Trường THPT Hoằng Hóa 11 Sáng kiến kinh nghiệm VAR L,R : integer; BEGIN {1} L := i; {Ðặt nháy L cực trái} {2} R := j; {Ðặt nháy R cực phải} {3} WHILE L = c DO R := R-1; {6} IF L < R THEN hd(a[L],a[R]); END; {7} Phanhoach := L; {Trả điểm phân hoạch} END; Trong hàm Phanhoach lệnh {1}, {2}, {3} {7} nối tiếp nhau, thời gianthực lệnh {3} lớn nhất, thời gian thực lệnh {3} thời gian thực hàm Phanhoach Các lệnh {4}, {5} {6} thân lệnh {3}, lệnh {6} lấy O(1) thời gian Lệnh {4} lệnh {5} thực việc di chuyển L sang phải R sang trái, thực chất duyệt phần tử mảng, phần tử lần, lần tốn O(1) thời gian Tổng cộng việc duyệt tốn j-i thời gian Vòng lặp {3} thực chất để xét xem duyệt xong, thời gian thực lệnh {3} thời gian thực hai lệnh {4} {5} j-i Đặc biệt i=1 j=n ta có T(n) = O(n) Bây trình bày thủ tục cuối có tên QuickSort ý để xếp mảng A gồm n phần tử ta cần gọi QuickSort(1,n) PROCEDURE VAR u,v, BEGIN v := IF v Quicksort(i,j:integer); k : integer; Findch(i,j); THEN GV: Trương Thị Quý – Trường THPT Hoằng Hóa 12 Sáng kiến kinh nghiệm BEGIN u := a[v]; k := Phanhoach(i,j,u); QuickSort(i,k-1); QuickSort(k,j); END; END; Giả sử giá trị mảng khác nên hàm Findch tìm chốt đệ quy dừng kích thước toán Gọi T(n) thời gian thức việc QuickSort mảng có n phần tử Thời gian để tìm chốt phân hoạch mảng phân tích O(n) = n Khi n = 1, thủ tục QuickSort làm nhiệm vụ gọi hàm Findch với kích thước 1, hàm tốn thời gian O(1) =1 Trong trường hợp xấu ta chọn phải phần tử có giá trị lớn làm chốt, lúc việc phân hoạch bị lệch tức mảng bên phải gồm phần tử chốt, mảng bên trái gồm n-1 phần tử lại Khi ta thành lập phương trình đệ quy sau: T(n)= nêu n = T(n - 1) + T(1) + n nêu n > Giải phương trình phương pháp truy hồi T(n) =O(n2) Có trường hợp thực thi cỡ O(nlogn) ttrường hợp trung bình c) Kết luận: Nếu chương trình gọi tới thủ tục xếp tập liệu nhỏ, việc sủ dụng thuật toán phức tạp (tuy có hiệu quả) không cần thiết, sử dụng thuật toán đơn giản có độ phức tạp O(N2), dễ cài đặt Tuy nhiên độ phức tạp O(N2) nên thời gian thực tăng lên lần số lượng phần tử tăng lên gấp đôi Do đó, trường hợp xếp với liệu lớn nên sử dụng thuật toán xếp nhanh III.5 Sắp xếp đếm phân phối (Distribution Counting) a) Phương pháp: Trong trường hợp khoá phần tử a[1],a[2], … ,a[n] số nguyên GV: Trương Thị Quý – Trường THPT Hoằng Hóa 13 Sáng kiến kinh nghiệm nằm khoảng từ tới k ta có thuật toán đơn giản hiệu sau: Xây dựng dãy C[0], C[1], C[2],…,C[k] C[v] số lần xuất khoá V dãy for V := to K c[V] := 0;{Khởi tạo dãy c} for i := to n c[a[i].key] := c[a[i].key] + 1; Như sau sếp Các phần tử có khoá đứng đoạn từ vị trí đến vị trí C[0] Các phần tử có khoá đứng đoạn từ vị trí C[0]+1 đến vị trí C[0] +C[1] Các phần tử có khoá đứng đoạn từ vị trí C[0] +C[1] +1 đến vị trí C[0]+ C[1] +C[2] … Các phần tử có khoá V đứng đoạn từ vị trí C[0] + C[1]+…+C[V-1] + đến vị trí C[0]+ C[1] +C[2] +….+ C[V-1] +C[V] … Các phần tử có khoá K đứng đoạn từ vị trí C[0]+C[1]+…+C[K-1]+1 đến vị trí C[0]+ C[1] +C[2] +….+ C[K1] +C[K] b Đánh giá: Độ phức tạp thuật toán là: T(n)= O(Max(N,K)) Với thuật toán phù hợp với dạng tập liên quan tới tìm tần suất số lần xuất phần tử mảng xâu…… GV: Trương Thị Quý – Trường THPT Hoằng Hóa 14 Sáng kiến kinh nghiệm IV MỘT SỐ VÍ DỤ VỀ THUẬT TOÁN SẮP SẾP VD1: Cho dãy a1, a2, a3, ,an, cá c đôi khác số nguyên dương k(1

Ngày đăng: 17/10/2017, 09:32

Từ khóa liên quan

Mục lục

  • Người thực hiện: TRƯƠNG THỊ QUÝ

  • Đơn vị công tác: Trường THPT HOẰNG HÓA2

Tài liệu cùng người dùng

Tài liệu liên quan