Bước đầu học sinh còn rất lúng túngtrong việc xác định và vận dụng sao cho hợp lý các thuật toán sắp xếp để bàitoán được giải quyết bằng một thuật toán tối ưu nhất.. Vì vậy tôi chọn đề t
Trang 1MỤC LỤC
1 MỞ ĐẦU 2
1.1 Lí do chọn đề tài 2
1.2 Mục đích nghiên cứu 2
1.3 Đối tượng nghiên cứu 2
1.4 Phương pháp nghiên cứu 2
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 3
2.1 Cơ sở lý luận 3
2.1.1 Thuật toán sắp xếp nổi bọt (bubble sort) 3
2.1.2 Thuật toán sắp xếp nhanh (quick sort) 4
2.1.3 Thuật toán sắp xếp phân phối 5
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm 6
2.3 Các giải pháp sử dụng để giải quyết vấn đề 6
2.3.1 Một số bài tập áp dụng thuật toán sắp xếp nổi bọt 6
2.3.2 Một số bài tập áp dụng thuật toán sắp xếp nhanh 11
2.3.3 Một số bài tập áp dụng thuật toán sắp xếp phân phối 16
2.4 Hiệu quả của đề tài 17
3 KẾT LUẬN 19
3.1 Kết luận 19
3.2 Kiến nghị 19
Trang 21 MỞ ĐẦU 1.1 Lí do chọn đề tài.
Trong quá trình dạy học tại trường THPT Tĩnh Gia 1, nhiều năm học tôiđược nhà trường phân công giảng dạy khối 11 và dạy bồi dưỡng học sinh giỏi
Tôi nhận thấy để học sinh đạt kết quả cao trong việc học bồi dưỡng thì giáo viênđóng một vai trò quan trọng trong việc định hướng các chuyên đề và hướng dẫnhọc sinh thực hiện
Một trong các chuyên đề mà học sinh cần học tập và rèn luyện nhiều trongkhi lập trình là các thuật toán về sắp xếp Bước đầu học sinh còn rất lúng túngtrong việc xác định và vận dụng sao cho hợp lý các thuật toán sắp xếp để bàitoán được giải quyết bằng một thuật toán tối ưu nhất
Nhằm nâng cao chất lượng dạy học môn Tin học 11, bồi dưỡng học sinh
khá giỏi Vì vậy tôi chọn đề tài: “Vận dụng một số thuật toán sắp xếp vào giải bài tập tin học trong bồi dưỡng học sinh giỏi”.
1.2 Mục đích nghiên cứu.
- Nghiên cứu tổng quan về mô phỏng thuật toán
- Trong phạm vi đề tài của mình tôi muốn nghiên cứu một số bài tập có ápdụng các thuật toán sắp xếp, nhằm giúp học sinh hình thành kỹ năng tư duy,phân tích bài toán và có thể áp dụng thuật toán sắp xếp giải bài toán tin học vớinhững vấn đề thường gặp trong khi lập trình
1.3 Đối tượng nghiên cứu.
- Học sinh khá giỏi lớp 11 trường THPT Tĩnh Gia 1
- Một số bài toán áp dụng thuật toán sắp xếp
1.4 Phương pháp nghiên cứu.
- Phương pháp nghiên cứu xây dựng cơ sở lý thuyết
- Kỹ thuật phân tích thuật toán
Trang 3- Tham khảo tài liệu là các tài liệu mở trên mạng internet và phân tích có
hệ thống các dạng bài tập theo nội dung đã đề ra
2. NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lý luận
2.1.1 Thuật toán sắp xếp nổi bọt (bubble sort)
Ví dụ bài toán: Cho dãy A gồm có N phần tử a1,a2,…an Hãy sắp xếp dãy
A thành dãy không giảm
Ý tưởng của thuật toán: Là tìm và đổi chỗ các cặp phần tử kề nhau chưa
đúng thứ tự Có thể tiến hành từ bên trái sang hoặc từ bên phải sang cho đến khikhông tồn tại cặp nào sai thứ tự ( dãy được sắp xếp)
- Lượt i: Ta xét từ cuối dãy ( chỉ đến phần tử thứ i), nếu gặp 2 phần tử kềnhau mà sai thứ tự thì đổi chỗ chúng cho nhau Sau lượt i, phần tử có khoá nhỏthứ i được đưa về vị trí i
- Xong lượt thứ n -1 thì dãy được sắp xếp xongChương trình:
Procedure boubblesort;
Var i,j,tg: integer;
Begin For i:=1 to n-1 do
For j:=n downto i+1 do
If a[j-1]>a[j] then
Begin
Trang 4Thuật toán có độ phức tạp: thời gian thực hiện là O(N2) [1]
2.1.2 Thuật toán sắp xếp nhanh (quick sort)
Ví dụ bài toán: Cho dãy A gồm có N phần tử a1,a2,…an Hãy sắp xếp dãy
A thành dãy không giảm
Ý tưởng của thuật toán:
- Sắp xếp một dãy được coi như là sắp xếp 1 đoạn từ chỉ số 1 đến chỉ số N
- Để sắp xếp 1 đoạn trong dãy, nếu đoạn chỉ có 1 phần tử thì dãy đã đượcsắp xếp, ngược lại ta chọn một phần tử x trong đoạn để làm chốt, mọi phần tửnhỏ hơn chốt được xếp vào vị trí trước chốt, mọi phần tử lớn hơn chốt được sắpxếp vào vị trí đứng sau chốt
- Sau phép hoán chuyển như vậy thì đoạn đang xét được chia làm hai đoạn
mà mọi phần tử trong phần đầu của đoạn đều nhỏ hơn hoặc bằng chốt và mọiphần tử sau của đoạn đều lớn hơn hoặc bằng chốt
- Tiếp tục sắp kiểu như vậy với 2 đoạn con ta sẽ được đoạn đã cho được sắpxếp theo chiều tăng dần
Ý tưởng của thuật toán được mô tả cụ thể như sau:
Giả sử phải sắp xếp đoạn có chỉ số từ L đến H:
- Chọn x là một phần tử ngẫu nhiên trong đoạn L H ( có thể chọn x là phần
tử ở giữa đoạn, nghĩa là x=a[(L+H) div 2])
- Cho i chạy từ L sang phải, j chạy từ H sang trái; nếu phát hiện một cặpngược thứ tự: i≤j và a[i]≥ x≥a[j] thì đổi chỗ hai phần tử đó; cho đến khi i>j lúc
đó dãy ở tình trạng: các phần tử đoạn L i≤x; các phần tử đoạn j H≥x
- Tiếp tục sắp xếp như vậy với đoạn L j và i H
Trang 5Thủ tục Quicksort(L,H) sau dùng để sắp xếp đoạn từ L tới H Để sắp xếp dãy số
ta gọi Quicksort(1,n)
Procedure Quicksort (L,H:longint);
Var i,j: longint;
X,tg: longint;
Begin
Repeat While a[i]<x do inc (i);
While a[j]>x do dec(j);
I<=j then Begin
- Thời gian thực hiện cỡ O(nlogn) trong trường hợp tốt nhất
- Thời gian thực hiện cỡ O(n2) trong trường hợp xấu nhất (hai đoạn đượcchia thành 1 đoạn n-1 và 1 đoạn là 1 phần tử) Khả năng để xảy ra trường hợpnày là rất ít, còn nếu chọn chốt ngẫu nhiên hầu như sẽ không xảy ra [1]
2.1.3 Thuật toán sắp xếp bằng đếm phân phối
Ví dụ bài toán: Cho dãy gồm N số nguyên tử a[1], a[2]….đến a[n] là các số
nguyên nằm trong đoạn từ 0 đến K, ta có thuật toán như sau:
- Xây dựng dãy b[0], b[1],…b[k], trong đó b[V] là số lần xuất hiện của khóa V trong dãy
Trang 6For v:=0 to k do b[v] :=0;
For i:=1 to n do b[a[i]]:=b[a[i]]+1;
- Ví dụ: Với dãy gồm 8 phần tử có dãy khoá bằng 1,0,3,4,1,3,0,3 ta có:
b[0]
Dãy số sau khi được sắp xếp: 0,0,1,1,3,3,3,4
Thuật toán có độ phức tạp: thời gian thực hiện là O(max(N,K)) [1]
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
- Khi tham gia dạy đội tuyển nhiều năm tại trường THPT Tĩnh Gia 1 tôinhận thấy học sinh còn rất lung túng trong việc áp dụng thuật toán sắp xếp đểgiải quyết yêu cầu của bài toán
- Một số vấn đề học sinh hay gặp phải là: khi nào cần dùng thuật toán sắpxếp cho bài và áp dụng thuật toán sắp xếp nào để thuật toán của bài được tối ưunhất với tất cả các bộ test có dữ liệu lớn nhỏ khác nhau
2.3 Các giải pháp sử dụng để giải quyết vấn đề 2.3.1 Một số bài tập áp dụng thuật toán sắp xếp nổi bọt
Ý tưởng: Vì N nhỏ (không quá 100) nên có thể làm trực tiếp như sau:
- Sử dụng hai vòng lặp lông nhau để liệt kê hết tất cả các phân số, rồi tối
Trang 7- Tiến hành sắp xếp phân số
- Loại bỏ các phân số trùng nhau
- Đưa ra phân số thứ k
Chương trình tham khảo:
var n,k: longint; t,m: array[0 100000] of longint;
f,f1: text; dem: longint; i,j,d: longint;
function MaxDivisor(a: longint; b: longint): longint;
beginwhile a<>b do
if a> b then a:=a-b else b:=b-a;
MaxDivisor:=b;
end;
procedure Toigian;
beginfor i:=1 to d-1 dobegin
t[i]:=t[i] div MaxDivisor(t[i],m[i]);
m[i]:=m[i] div MaxDivisor(t[i],m[i]);
if (t[i]/m[i]) > (t[j]/m[j]) then begin
Trang 8readln(f,n,k); close(f);
t[0]:=0; m[0]:=1; d:=1;
for i:=2 to n dofor j:=1 to i-1 dobegin
Trang 9Bài tập 2: BAO PHỦ TRỤC
Trong giờ Hình học 10, thầy giáo biểu diễn N ( N≤104) đoạn thẳng trên mộttrục số, với các điểm đầu xi và độ dài di (|xi|,di là những số nguyên không vượtquá 109)
Yêu cầu: Hãy giúp thầy giáo tính xem tổng độ dài trục số mà N đoạn thẳng
đó che phủ lên
Dữ liệu vào: Vào từ file văn bản BAI2.INP:
- Dòng đầu chứa số nguyên dương N.
- N dòng tiếp theo, mỗi dòng chứa hai số nguyên xi và di
Kết quả: Ghi ra file văn bản BAI2.OUT một số nguyên dương duy nhất là
kết quả của bài toán [2]
BAI2.INP3
5 10
0 6-100 10
Ý tưởng:
- Sắp xếp các đoạn số theo điểm đầu xi, sau đó duyệt lần lượt từng đoạn một
để tính tổng độ dài bị phủ
- Giả sử các đoạn (x1,d1), (x2,d2),… ,(xn,dn) ta sẽ sắp xếp tăng dần theo xi
Chương trình tham khảo:
var f,f1: text; n: integer;
x,d: array[1 10000] of longint;
i,j,tmp: longint;
kq,p: longint;
procedure Sapxep;
Trang 10var tmp: longint;
begin for i:=1 to n-1 do for j:=n downto i+1 do
if x[i]>x[j] then begin tmp:=x[i]; x[i]:=x[j]; x[j]:=tmp;
tmp:=d[i]; d[i]:=d[j]; d[j]:=tmp;
end;
end;
beginassign(f,'BAI2.INP'); reset(f);
if p<x[i]+d[i] then beginkq:=kq+x[i]+d[i]-p;
p:=x[i]+d[i];
Trang 11assign(f1,'BAI2.OUT'); rewrite(f1);
writeln(f1,kq); close(f1);
end
2.3.2 Một số bài tập áp dụng thuật toán sắp xếp
nhanh Bài tập 3 DÃY CON ZERO
Cho dãy gồm N (N≤10000) số nguyên a1,a2,…an (|ai|≤109)
Yêu cầu: Hãy cho biết dãy con liên tiếp dài nhất trong dãy N có tổng số phần tử là 0 [2]
ZERO.INP13
nếu đoạn con liên tiếp từ i đến j có tổng bằng 0 thì S[i-1]=S[j]
- Bước 2: Dễ dàng tìm dãy con liên tiếp có tổng bằng 0 nếu dãy S được sắpxếp
Chương trình tham khảo:
var n,i,j: longint;t,s,a: array[0 10000] of longint;
tmp,max,luud,luuc: longint;
procedure QSort(l: longint; h: longint);
var x: longint;
begin i:=l; j:=h;
x:=t[(l+h) div 2];
Trang 12repeat while t[i]<x do inc(i);
readln(f,n);
for i:=1 to n dobeginread(f,a[i]); s[i]:=i;
for i:=1 to n do
Trang 13QSort(1,n);
max:=0;luud:=0; luuc:=0;
for i:=0 to n-1 dofor j:=n downto i+1 do begin
if t[i]=t[j] thenbegin
for i:=luud+1 to luuc do write(f1,a[i],' ');
close(f1);
end;
beginInput; Xuly; Output;
end
Trang 14Bài tập 4 Ghép số lớn
Vaxia đã viết được một số lớn trên một cuộn giấy dài và muốn khoe với anhtrai Petia về thành quả vừa đạt được Tuy nhiên, khi Vaxia vừa ra khỏi phòng đểgọi anh trai thì cô em Kachia chạy vào phòng và xé rách cuộn giấy thành một sốmảnh Kết quả là trên mỗi mảnh có một hoặc vài kí số theo thứ tự đã viết Bâygiờ Vaxia không thể nhớ chính xác mình đã viết số gì Vaxia chỉ nhớ rằng đó làmột số rất lớn Để làm hài lòng cậu em trai, Petia quyết định truy tìm số nào làlớn nhất mà Vaxia đã có thể viết lên cuộn giây trước khi bị xé Bạn hãy giúpPetia làm việc này
Dữ liệu vào:
Gồm nhiều dòng mỗi dòng ghi một dãy kí số Số dòng không vượt quá
1000 Mỗi dòng ghi từ 1 đến 100 kí số Bảo đảm rằng có ít nhất một dòng mà kí
- Lưu các số dưới dạng mảng kiểu xâu
- Thực hiện sắp xếp mảng theo thứ tự tăng dần theo tiêu chí sắp xếp là phần tử s[i] đứng trước phần tử s[j] khi (s[i] ghép với s[j]) > (s[j] ghép với s[i])
Chương trình tham khảo vars: array[0 1000] of string;
i,n,j: word;
procedure qsort(L,H: word);
Trang 15while tg+s[j]>s[j]+tg do dec(j);
if i<=j then begin
if i<j then begin
while s[n]<>'' dobegin
Trang 16end
Bài tập 5 Đếm xâu con
Cho xâu s (có độ dài không vượt quá 104) chỉ gồm các ký tự từ 'a' đến 'z'
Đếm số lượng xâu con liên tiếp khác nhau nhận được từ xâu s
Ví dụ: S = 'abab' có 7 xâu con là: a, b, ab, ba, aba,bab,abab [2]
* Ý tưởng:
- Lưu các xâu con có độ dài i (với i từ 1 đến length(s)) vào một mảng
- Sau đó sắp xếp mảng tăng dần theo độ dài các xâu con rồi thực hiện đếm
số lượng các xâu con khác nhau ta được số lượng xâu con có độ dài i
2.3.3 Một số bài tập áp dụng thuật toán sắp xếp phân phối Bài tập 6: Phần tử xuất hiện nhiều nhất
Viết chương trình nhập từ bàn phím số nguyên dương N (0<N≤500) và các phần
tử của mảng 1 chiều a(n) có các giá trị nguyên dương (0<ai<100)
Yêu cầu: Hãy cho biết giá trị xuất hiện nhiều nhất trong A và xuất hiện bao
nhiêu lần?
ví dụ: a(16)={1,2,3,5,4,5,6,5,6,7,1,6,5,5,8,9} thì phần tử có giá trị bằng 5 là nhiều nhất số lượng phần tử này là 5
Ý tưởng thuật toán:
- Khỏi tạo mảng B ban đầu tất cả các phần tử đêu bằng 0
- Các phần tử B[x] là số lượng các phần tử có giá trị a[i]
For i:=1 to n do
Trang 17BeginWrite('a[',i,']= ');
Nhập vào số nguyên dương N (N≤103) và dãy số a1, a2…an Hãy cho biết
có bao nhiêu phần tử khác nhau trong dãy trên
Ý tưởng thuật toán:
- Khởi tạo mảng B đánh chỉ số từ 1 đến 32000 Giá trị các phần tử trong B có giá trị ban đầu bằng 0
- Duyệt mảng A ban đầu, đếm số lượng các phần tử a[i] giống nhau lưu vào mảng B là phần tử b[a[i]]
- Đếm các phần tử trong mảng B khác 0 chính là số phần tử khác nhau của dãy ban đầu
2.4 Hiệu quả của đề tài
- Qua nhiều năm trực tiếp dạy bồi dưỡng học sinh giỏi tại trường THPT TĩnhGia 1 tôi đã hệ thống và tổng hợp lại một số bài tập có sử dụng thuật toán sắp
Trang 18xếp Tôi đã cho học sinh bồi dưỡng học và thực hành các thuật toán sắp xếpkhác nhau và các em đã áp dụng để giải quyết được bài toán Đối với từng yêucầu và dữ liệu của đề bài các em đã biết nên sử dụng thuật toán sắp xếp nào phùhợp.
- Kết quả học sinh giỏi cấp tỉnh môn tin học một số năm gần đây của trường THPT Tĩnh Gia 1:
+ Năm học 2017 -2018 có 1 giải nhất+ Năm học 2018 – 2019 có 2 giải nhì+ Năm học 2020 -2021 có 1 giải ba
Trang 193 KẾT LUẬN 3.1 Kết luận
- Sau khi thực hiện áp dụng các thuật toán sắp xếp vào dạy học bồi dưỡnghọc sinh giỏi tại trường Tĩnh Gia 1 thì kết quả đội tuyển của học sinh đã vượttrội hơn hẳn
- Học sinh đã có thể phân biệt được các dạng bài tập có áp dụng thuật toánsắp xếp và thực hiện được bài toán đó Điều này đã minh chứng cho tính đúngđắn của phương pháp và kết quả khi áp dụng đề tài trong dạy học bồi dưỡng họcsinh giỏi
3.2 Kiến nghị Đối với nhà trường:
Giáo viên giảng dạy bộ môn tin học có thể áp dụng các phương pháp trong
đề tài giảng dạy trên lớp và giảng dạy bồi dưỡng học sinh đổi tuyển nhằm nângcao chất lượng dạy học môn Tin học
Đối với các phòng GD – ĐT và Sở GD – ĐT
- Có thể triển khai những phương pháp trong đề tài vào việc giảng dạy mônTin học giúp học sinh có thể phát triển tư duy, tích cực trong việc nghiên cứutìm tòi các dạng bài tập và ngày càng nâng cao kết quả học tập của học sinh,
- Trong quá trình thực hiện viết sáng kiến còn có nhiều hạn chế, khôngtránh khỏi những thiếu sót, rất mong sự đóng góp ý kiến để SKKN được hoànthiện hơn
Trang 20Xác nhận của Hiệu trưởng Nghi Sơn, ngày 20 tháng 05 năm 2021
Tôi xin cam đoạn đây là SKKN của mình viết,không sao chép nội dung của người khác
Người viết
Lê Thị Hợp
Tài liệu tha
m khảo :
[1] Tài liệu chuyên tin học
- Quyển 1, NXB Giáo dục
Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh
Hoàng, Nguyễn Thanh Hùng
[2] Tài liệu chuyên tin học
- Bài tập - Quyển 1, NXB
Giáo dục Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng
[3] Một số tài liệu từ Internet.
Trang 2120
Trang 22UAN VAN CHAT LUONG download : add luanvanchat@agmail.com