Tải bản đầy đủ (.doc) (24 trang)

Sử dụng giải thuật sắp xếp giúp học sinh giải các bài toán trong lập trình theo định hướng phát triển năng lực

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (290.9 KB, 24 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT BA ĐÌNH NGA SƠN

SÁNG KIẾN KINH NGHIỆM

SỬ DỤNG GIẢI THUẬT SẮP XẾP
GIÚP HỌC SINH GIẢI CÁC BÀI TOÁN TRONG LẬP TRÌNH
THEO ĐỊNH HƯỚNG PHÁT TRIỂN NĂNG LỰC

Họ và tên: Vũ Thị Huệ
Chức vụ: Giáo Viên
SKKN thuộc môn: Tin Học

THANH HOÁ, NĂM 2020


Mục lục
1. Mở đầu..........................................................................................................1
1.1 Lý do chọn đề tài.....................................................................................1
1.2 Mục đích nghiên cứu................................................................................1
1.3 Đối tượng nghiên cứu..............................................................................1
1.4 Phương pháp nghiên cứu.........................................................................1
1.5 Những điểm mới của sáng kiến................................................................2
2. Nội dung sáng kiến kinh nghiệm.................................................................2
2.1 Cơ sở lý luận của vấn đề..........................................................................2
2.2 Thực trạng của vấn đề trước khi áp dụng sáng kiến kinh nghiệm............3
2.3 Giải pháp và tổ chức thực hiện.................................................................3
2.4 Hiệu quả của đề tài nghiên cứu .............................................................13
3 . Kết luận và đề xuất……………………………………..…………………20
3.1 Kết luận…………………….…………..………………..……………...20


3.2 Đề Xuất …………………………………………………….…………..20


1. Mở đầu
1.1. Lý do chọn đề tài.
Sắp xếp( Sort) hiểu tổng quát là quá trình tuyển lựa, bố trí sắp đặt lại vị trí
các đối tượng dữ liệu theo một trật tự nhất định. Sắp xếp đóng vai trò rất quan
trọng trong cuộc sống nói chung và trong Tin Học nói riêng. Ý nghĩa và công
dụng của sắp xếp là giúp đơn giản hóa việc tìm kiếm các phần tử trong khối dữ
liệu đã được sắp xếp. Thử hình dung xem, một cuốn từ điển, nếu các từ không
được sắp xếp theo một trật tự, sẽ khó khăn như thế nào trong việc tra cứu các từ.
Theo nhà khoa học D.Knuth thì có tới 40% thời gian tính toán của máy tính là
dành cho việc sắp xếp. Như vậy sắp xếp là công việc thường hay sử dụng trong
lập trình, nó cũng là thao tác cơ bản và quan trọng trong xử lý dữ liệu [5] .
Trong quá trình giảng dạy trên lớp cũng như bồi dưỡng cho học sinh mũi
nhọn, tôi luôn phải sử dụng tới các kỹ thuật sắp xếp để giải các bài toán có ứng
dụng của thuật toán sắp xếp. Trong đề tài sáng kiến kinh nghiệm lần này tôi
mạnh dạn trình bầy về các thuật toán đến chương trình đề sắp xếp dữ liệu đã
được đưa vào bộ nhớ chính. Tôi đã áp dụng để truyền đạt cho các học sinh của
mình, thu được các tiết học thực sự lý thú và có hiệu quả.
1.2. Mục đích nghiên cứu.
- Mục đích nghiên cứu của sáng kiến này tôi muốn trình bầy làm rõ về các thuật
toán sắp xếp tiêu biểu để ứng dụng vào giải các bài toán ở mức độ THPT.
- Nắm vững về cấu trúc cú pháp và hoạt động của các giải thuật sắp xếp tiêu
biểu.
- Luyện cho học sinh kỹ năng viết, sử dụng các kỹ thuật sắp xếp khi lập trình
- Học sinh biết vận dụng kiến thức về giải thuật sắp xếp giải quyết các vấn đề
thực tiễn, phát huy những suy nghĩ tích cực, tư duy sáng tạo. Huy động tiềm
năng của học sinh, góp phần hình thành năng lực giải quyết vấn đề cho học sinh.
1.3. Đối tượng nghiên cứu.

- Sử dụng giải thuật sắp xếp dữ liệu khi giải bài toán trên máy tính trong chương
trình phổ thông một cách khoa học và hiệu quả nhất.
- Tôi đã áp dụng sáng kiến này với các em học sinh khối 10 và khối 11 trường
THPT Ba Đình – Nga Sơn – Thanh Hóa. Dạy cho các em biết và hiểu được việc
viết các chương trình áp dụng thuật toán sắp xếp giải các bài toán trên máy tính
không phải là khó, các em thấy được tính ứng dụng thực tiễn của bài toán sắp
xếp rất lớn, các em thực sự yêu thích và đam mê học lập trình Tin Học.
1.4. Phương pháp nghiên cứu.
Khi nghiên cứu và áp dụng đề tài này tôi đã sử dụng các 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, qua các văn bản chủ trương
của Đảng, chính sách pháp luật của nhà nước về giáo dục và đào tạo.
- Phương pháp phân tích tổng hợp, thu thập thông tin từ nhiều nguồn tài liệu.
- Phương pháp điều tra khảo sát thực tế và xử lý số liệu. Đảm bảo tính chính xác
của thực trạng, hiệu quả của vấn đề nghiên cứu và rút ra những kết luận quan
trọng.


1.5.

Những điểm mới của sáng kiến.

- Sáng kiến này tôi đã làm và áp dụng lần đầu tại trường THPT Ba Đình - Nga
Sơn - Thanh Hóa và đã đem lại kết quả cao.
- Sáng kiến này đề cập đến những khía cạnh khác nhau của các kỹ thuật sắp xếp
dữ liệu. Từ đó đánh giá thời gian thực thi cũng như dung lượng bộ nhớ cấp phát
của mỗi kỹ thuật sắp xếp. Người lập trình có thể chọn và áp dụng thuật toán sắp
xếp phù hợp với mỗi yêu cầu bài toán và dữ liệu đặt ra.
2. Nội dung sáng kiến kinh nghiệm
2.1. Cơ sở lý luận của sáng kiến kinh nghiệm.

Theo nhà khoa học D.Knuth đã nghiên cứu và chứng minh thì 40% thời
gian tính toán của máy tính là dành cho sắp xếp. Không phải ngẫu nhiên thuật
toán sắp xếp nhanh( Quick Sort) được bình chọn là một trong 10 thuật toán tiêu
biểu của thế kỷ XX [5]. Trong các chương trình giảng dạy Tin Học ở các cấp
học nói chung việc sắp xếp dữ liệu luôn được đề cập, trong Tin Học lớp 10 và
lớp 11 các em học sinh được học từ thuật toán đến chương trình để sắp xếp các
phần tử của mảng theo thứ tự tăng dần hoặc giảm dần là một ví dụ rất bổ ích cho
việc nắm vững các phép xử lý mảng [2]. Tuy nhiên thuật toán sắp xếp chủ đạo
trong sách giáo khoa Tin Học lớp 10 và lớp 11 đưa ra là thuật toán sắp xếp bằng
tráo đổi ( Exchange Sort) hay còn có tên gọi khác là sắp xếp nổi bọt( Bubble
Sort) thích hợp với các bài toán cơ sở có dữ liệu nhỏ [1]. Khi giải các bài toán
với dữ liệu lớn hơn, yêu cầu độ phúc tạp nhỏ, cần thời gian chạy ít hợn, tôi đã
tìm hiểu đến các thuật toán sắp xếp khác nhau để phù hợp cho mỗi bài toán đặt
ra và tôi sẽ trình bầy trong sáng kiến kinh nghiệm này.
Bên cạnh đó, cá nhân tôi nhận thức về tầm quan trọng của việc tăng
cường đổi mới dạy học Bộ giáo dục và đào tạo đã tập trung chỉ đạo thông qua
nghị quyết Hội nghị trung ương 8 khóa XI về việc đổi mới căn bản, toàn diện
giáo dục và đào tạo nêu rõ: ” Tiếp tục đổi mới mạnh mẽ phương pháp dạy học
và học theo phương pháp hiện đại, phát huy tính tích cực, chủ động sáng tạo và
vận dụng kiến thức, kỹ năng của người học, khắc phục lối truyền thụ áp đặt một
chiều, ghi nhớ máy móc. Tập trung dạy cách học, cách nghĩ, khuyến khích tự
học, tạo cơ sở để người học tự cập nhật và đổi mới trí thức, kỹ năng phát triển
năng lực. Chuyển từ học trên lớp sang tổ chức hình thức học tập đa dạng, chú ý
các hoạt động đa dạng, ngoại khóa, nghiên cứu khoa học. Đẩy mạnh ứng dụng
công nghệ thông tin và truyền thông trong dạy học...”
Hiện nay trong các tài liệu về các ngôn ngữ lập trình rất phong phú và đa
dạng. Việc đưa ra hệ thống các bài tập có tính phân bậc để luyện kỹ năng cho
các em hoc sinh giúp các em dễ dàng nắm bắt nội dung của bài học mà còn định
hướng và phát triển tư duy cho các em về khả năng ngôn ngữ lập trình, linh hoạt
và hình thành năng lực tích cực, thiết thực cho các em. Xây dựng cơ sở cả về lý

thuyết lẫn vận dụng, đem lại hiệu quả cao cho người học và người dạy.
2.2. Thực trạng của vấn đề trước khi áp dụng sáng kiến kinh nghiệm.
Về tinh thần thái độ của các em hoc sinh tại trường THPT Ba Đình
4


tôi thấy rằng các em nhận thức được vai trò lớn lao của ứng dụng công nghệ
thông tin trong “ Cách mạng công nghiệp 4.0” hiện nay, các em rất hào hứng,
tích cực xây dựng các ý tưởng để giải các bài toán trên máy tính. Thích được
lắng nghe quy trình để làm ra được các sản phẩm phần mềm mà thực tế các em
đang sử dụng, điều đó kích thích được niềm say mê học lập trình của các em.
Trong chương trình Tin Học THPT tại Nga Sơn, Lập trình Pascal là môn
học khó, hầu hết các học sinh đều chưa được học và làm quen ở dưới cấp hai
nên các em tỏ ra rất lúng túng khi lựa chọn thuật toán, khó khăn trong việc diễn
đạt các câu lệnh, cú pháp để viết chương trình.
Khi dạy học trên lớp, đặc biệt việc bồi dưỡng cho các học sinh mũi nhọn,
khi giải về các bài toán cần sử dụng đến thuật toán sắp xếp, nếu các em chỉ sử
dụng thuật toán sắp xếp như sách giáo khoa đưa ra sẽ gặp nhiều khó khăn để sử
lý cả về số liệu lẫn thời gian chạy chương trình.Chương trình sẽ không kiểm tra
được hết các Text đề ra và kết quả sẽ không cao. Vì vậy tôi đã mạnh dạn áp dụng
đề tài:
“ SỬ DỤNG GIẢI THUẬT SẮP XẾP
GIÚP HỌC SINH GIẢI CÁC BÀI TOÁN TRONG LẬP TRÌNH
THEO ĐỊNH HƯỚNG PHÁT TRIỂN NĂNG LỰC ”

2.3. Giải pháp và tổ chức thực hiện
2.3.1. Khái niệm.
2.3.1.1 Định nghĩa sắp xếp.
Xét một cách tổng quát, giả sử có các phần tử a 1, a2, a3....an sao cho với
một thứ tự f cho trước sẽ thỏa nãm: f(a1) <= f(a2) <= f(a3) <= f(a4)....<= f(an)

Việc sắp xếp là hoán vị các phần tử này theo một thứ tự nào. Thông
thường hàm thứ tự không được tính theo một quy tắc nhất định và được lưu trữ
như một thành phần tường minh của mỗi phần tử. Giá trị của nó được gọi là
khóa của phần tử [2].
Để đánh giá một giải thuật sắp xếp thường dựa vào các thông số sau:
• Dung lượng bộ nhớ sử dụng (Cm)
• Thời gian thực thi (Ct): Bao gồm 2 thông số phụ:
a)
Số lần so sánh (C)
b)
Số lần đổi chỗ (M)
Trong các giải thuật của sáng kiến này chúng ta chỉ đánh giá về thời gian thực
thi còn dung lượng bộ nhớ sử dụng của các giải thuật thì gần như nhau .
Trong sáng kiến kinh nghiệm lần này tôi sẽ trình bầy về các giải thuật sắp xếp
tiêu biểu cùng các ví dụ minh họa.
2.3.1.2. Phân loại giải thuật sắp xếp.
2.3.1.2.1. Giải thuật chọn trực tiếp ( Straightselection)
- Nguyên lý giải thuật. Chọn phần tử có khóa nhỏ nhất, đổi chỗ của nó với phần
tử thứ nhất a1. Tiếp tục thao tác này trước tiên cho n-1 phần tử còn lại sau đó với
n-2 phần tử cho tới khi còn lại một phần tử là phần tử lớn nhất[4].
Với cách thức như trên, sau mỗi lần chọn thì kích thước của của mảng cần sắp
xếp sẽ giản dần.
5


- Phân tích đánh giá: Nếu sử dụng giải thuật chọn trực tiếp thì:
+ C = n2/2
+ Mmin = 3(n-1)
+ Mmax = 3(n-1)+ n2/2
+ Mavg = n ln(n)

2.3.1.2.2. Giải thuật đổi chỗ
a. Giải thuật nổi bọt ( Buble sort )
- Nguyên lý giải thuật: Giải thuật nổi bọt dựa trên nguyên lý so sánh và đổi chỗ
liên tiếp các cặp phần tử đứng kề nhau cho tới khi tất cả các phần tử được sắp
xếp theo thứ tự. Ta duyệt mảng nhiều lần và mỗi lần thực hiện thì đẩy phần tử
nhỏ nhất của phần còn lại qua đầu bên trái của mảng. Ví dụ giả sử có mảng sau:
44 55 12 64 06 94 67 i:=1
06 44 55 12 64 67 94 i:=2
06 12 44 55 64 67 94 i:=3
- Phân tích và đánh giá giải thuật: Nếu sử dụng giải thuật nổi bọt thì
+ C = n(n-1)/2
+ Mmin = 0 (khi mảng đã có thứ tự)
+ Mmax = 3n(n-1)/2 ( khi mảng có thứ tự ngược )
+ Mavg = 3n2/4
- Giải thuật này tương đối tốt và dễ hiểu nên thường được sử dụng đối với n nhỏ.
b. Giải thuật rung ( Sshakersort )
- Nguyên lý giải thuật: Giải thuật rung là giải thuật cải tiến của giải thuật nổi
bọt. Đối với giải thuật nổi bọt thì mỗi lần ta chỉ đẩy được 1 phần tử vào mảng đã
sắp thứ tự. Người ta đã cải tiến để có thể mỗi lần duyệt thì có thể tìm một đoạn
mảng đã có thứ tự để đưa đoạn đó vào phần mảng đã sắp xếp thứ tự. Với cách
cải tiến này thì có thể duyệt trên cả 2 phía( trái, phải) của mảng, sau mỗi lần
duyệt có thể có nhiều phần tử được bổ xung vào mảng đã sắp xếp thứ tự. Ví dụ
có mảng số nguyên 44 55 12 64 06 94 67 . Quá trình thực hiện giải thuật như
sau
L R
44 55 12 64 06 94 67
2
7
06 44 55 12 64 67 94
3

7
06 44 12 55 64 67 94
3
3
06 12 44 55 64 67 94
4
2
L:=2 phần tử a[i] bên trái có thứ tự (i < 1)
R:= n Phần tử a[r]...a[n] bên phải đã có thứ tự.
- Phân tích đánh giá giải thuật: Nếu sử dụng giải thuật rung thì:
+ Cmin = n
+ Cmax = n(n-1)/2
+ Cavg = (n2 – nln – (b +ln2 – 1)n)/4 với b là hằng số Euler
+ Mmin = 0 ( khi mảng đã có thứ tự )
+ Mmax = 3n(n-1)/2 ( khi mảng có thứ tự ngược )
+ M avg = 3(n2- nln – (b+ln2-1)n)/4
6


Giải thuật này tuy tốt hơn giải thuật nổi bọt nhưng cũng chỉ nên sử dụng với n
nhỏ.
2.3.1.2.3. Giải thuật sắp xếp nhanh
a. Giải thuật Shell.
- Nguyên lý giải thuật. Từ mảng ban đầu ta chia thành h(1) nhóm và thực hiện
h(1) – sort. Sau đó ta lại chia làm h(2) nhóm và thực hiện h(2) – sort. Cứ tiếp tục
như vậy cho tới khi ta chia h(t)=1 nhóm và thực hiện h(t) – sort.
Từ nguyên lý này ta suy ra giải thuật chèn trực tiếp ( Straightinsertion) chỉ
là một trường hợp riêng của giải thuật Shell với h:=1. Ví dụ
42 44 94 12 55 67 06 40
42 44 06 12 55 67 94 40

4-sort
06 12 42 40 55 44 94 67
2-sort
06 12 40 42 44 55 67 94
1-sort
- Phân tích đánh giá giải thuật: Nếu sử dụng giải thuật Shell thì:
Với các bước chọn hợp lý, Knuth giới thiệu 2 cách chọn h (luôn luôn h(t) =1).
h(i) = 2h(i+1) +1 và t = ruond(log2n)-1. Với cách chọn này ta có:
C = 1.22n1.26
M= 1.22n1.26
h(i) =3h(i+1)+1 và t = round(log3n)-1. Với cách chọn này ta có.
C = 1.66n1.22
M= 1.66n1.22
Giải thuật này tốt hơn các giải thuật trên [2].
b. Giải thuật Heapsort
- Định nghĩa Heap: Một mảng số a(1)..a(n) được gọi là một heap nếu thỏa mãn
điều kiện sau: Với mọi j, round(j/2) ϵ (l,r)
A(round(j/2).key ≤ a[j].key
- Tính chất của Heap:
Cho mảng a(1)..a(n) luôn luôn tồn tại một Heap a(round(n/2)+ ..a(n).
Nếu tồn tại một Heap a(1)..a(n) thì luôn luôn có a(1).key bé nhất. Ta có thể diễn
tả Heap dưới dạng một cây với nút gốc là nút bé nhất
- Nội dung của giải thuật:
+ Lấy a(1) ra khỏi Heap
+ Đem (a(2)..a(n) so sánh để chọn nút gốc và cứ làm tiếp tục cho đến khi
được một mảng có thứ tự.
Giải thuật cơ bản của Heapsort là shift(l,r), ở rộng heap l+1..r thành heap l..r
Phân tích và đánh giá giải thuật: Nếu sử dụng giải thuật heapsort thì:
Cmax = 7n + 2nlog2n
Mmax = 17n/2/+ nlog2n

Cavg = nlog2n-1.87n
M= nlog2n -0.9n
So với các giải thuật trên thì giải thuật này là lý tưởng vì trong mọi trường hợp
nó tỷ lệ với nlog2n [2].
c. Giải thuật ( Quick Sort )

7


- Nguyên lý giải thuật: Sắp xếp 1 dãy được coi là sắp xếp một đoạn từ chỉ số 1
đến chỉ số n. Để sắp xếp một đoạn trong dãy, nếu đoạn chỉ có một phần tử thì
đoạn dãy đã được sắ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ử có khóa nhỏ hơn khóa của “chốt” được xếp vào vị trí đứng
trước “chốt”, mọi phần tử có khóa lớn hơn “chốt” được xế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 có khóa nhỏ hơn hoặc bằng (<=)
khóa của “chốt” và mọi phần tử trong phần sau của đoạn đều có khóa lớn hơn
hoặc bằng(>=) khóa của “chốt”. Tiếp tục sắp xếp kiểu như vậy với hai đoạn
con, ta sẽ được đoạn đã cho được sắp xếp theo chiều tằng dần của khóa.
- Phân tích và đánh giá giải thuật: Nếu sử dụng giải thuật Quick sort có các
thông số
+ Cmin = nlog2n
+ Cmax = n2
+ Mmin = nlog2n /2
+ Mmax = n2
Trên thực tế, giải thuật Quicksort luôn luôn nhanh hơn giải thuật Heapsort tới
1/3n thời gian. Dó đó đây là giải thuật tốt nhất và được đánh giá là một trong 10
thuật toán tiêu biểu của thế kỷ XX [5].
2.3.2. Mô tả các giải thuật thông dụng.
Như vậy ở mục 2.3.1 tôi đã mô tả tóm tắt nguyên lý và phân tích đánh giá

các giải thuật sắp xếp. Bạn đọc có thể sẽ cảm thấy đôi chỗ khó hiểu nhất là phần
đánh giá giải thuật, bạn có thể bỏ qua mục này, Phần sau đây tôi sẽ mô tả chi tiết
và minh họa chương trình cụ thể cho những gải thuật thông dụng.
Chúng ta chia các giải thuật đã trình bày thành 2 loại:
- Loại giải thuật đơn giản hay còn gọi là giải thuật cổ điển như các giải thuật
chèn, chọn và đổi chỗ, với loại này, tôi nghiên cứu 2 giải thuật chọn trực tiếp và
nổi bọt.
- Loại giải thuật phức tạp tôi nghiên cứu về giải thuật Quicksort.
Muốn sắp xếp các phần tử của mảng theo một thứ tự nào đó, chúng ta cần có 2
thao tác cơ bản đó là
+ So sánh 2 phần tử với nhau.
+ Hoán vị (thay đổi vị trí trong mảng).
Vậy tôi xây dựng 2 thao tác trên để sử dụng cho việc mô tác cho các giải thuật
sắp xếp dưới đây.
- Tạo hàm so sánh: Đối với các kiểu dữ liệu chuẩn, để so sánh 2 dữ liệu cùng
kiểu, Pascal ta sử dụng các toán tử so sánh (toán tử quan hệ). Nhưng với các
kiểu dữ liệu có cấu trức như kiểu mảng mà ta đang xét không thể sử dụng các
toán tử quan hệ để so sánh 2 phần tử mảng với nhau được [2].
Vì vậy, để định nghĩa dữ liệu X bé hơn dữ liệu Y, nếu với điều kiện nào đó
của X bé hơn điều kiện của Y thì hàm so sánh behon cho kết quả đúng(true) và
ngược lại cho kết quả sai(false)
Funtion behon(x,y:<kiểu>):boolear;
Begin
8


Behon:= < Biểu thức so sánh trên 2 dữ liệu>;
End;
- Tạo thủ tục hoán vi 2 phần tử: Giả sử có 2 phần tử a[i] > a[i+1] nào đó, bây giờ
ta cần thay đổi vị trí để cho phần tử a[i+1] chuyển sang vị trí của phần tử a[i] và

phần tử a[i] lại chuyển sang vị trí của a[i+1] ta thực hiện như sau:
Sử dụng 1 biến tam để gán giá trị của phần tử a[i] cho biến này:
+ tam:= a[i];
+ Gán giá trị của phần tử a[i+1] cho a[i]: a[i]:= a[i+1];
+ Gán giá trị của tam cho phần tử a[i+1]: a[i+1]:= tam;
Thủ tục hoanvi như sau:
Procedure hoanvi( Var x,y:<kiểu>) ;
Var
Tam:<kiểu>;
Bgin
Tam:=x;
x:=y;
y:=tam;
End;
2.3.2.1. Mô tả cho giải thuật chọn trực tiếp
Như phần trình bầy về khái niệm, giải thuật chọn bắt đầu so sánh từ phần tử
đầu tiên với phần tử còn lại. Nếu thỏa nãm điều kiện so sánh ( tăng dần hoặc
giảm dần) thì hoán đổi 2 phần tử với nhau, tiếp tục so sánh phần tử kế tiếp với
các phần tử còn lại. Thực hiện tiếp tục như vậy cho đến phần tử cuối cùng.
Muốn thực hiện trình tự như trên, chúng ta phải sử dụng 2 vòng lặp For
+ Vòng lặp thứ nhất: Lần lượt chọn phần tử thứ i với i từ 1 đến n-1 để so sánh
và hoán vị với phần tử thứ j.
+ Vòng lặp thứ hai: lần lượt chọn các phần tử thứ j với j từ i đến n.
Giả sử chúng ta sắp xếp theo thứ tự tăng dần thì phải thực hiện hoán vị khi phần
tử thứ i>j. Ngược lại, nếu sắp xếp giảm dần thì phải hoán vị khi j>i.
Ví dụ: Nếu muốn sắp xếp 1 mảng A có n phần tử thì thủ tục viết cho giải thuật
chọn trực tiếp như sau.
Procedure Chon(Var a:<kiểu>; n :byte);
Var
I,j:byte;

Begin
For i:=1 to n-1 do
For j:= 1 to n do
If behon(a[j],a[i]) then
Hoanvi(a[i],a[j]);
End;
Với giải thuật này thì phần tử thứ nhất phải so sánh với n-1 phần tử còn
lại, phần tử thứ i phải so sánh với n-1 phần tử còn lại. Như vậy số lần sắp xếp
mảng A là: (n-1)+(n-2)+ (n-3) + …n(n-1)/2.

9


Tóm lại giải thuật chọn trực tiếp có ưu điểm là giải thuật đơn giản, dễ hiểu
khi nghiên cứu và giảng dạy nhưng trong thực tế ta chỉ sử dụng khi n nhỏ vì số
lần sắp xếp khá nhiều( tương đương n2)[2] .
Ví dụ: Chương trình sử dụng giải thuật chọn để sắp xếp từ nhỏ đến lớn các phần
tử của một mảng các số nguyên.
Program Gtchon;
Const
Spt=10;
Var
A:array[1..spt] of integer;
min, vitri, i, j:integer;
Begin
Writeln(‘ sap xep mang bang giai thuat chon’);
For i:=1 to spt do
Begin
Write(‘ phan tu’,a[‘,i,’] =’); readln (a[i]);
End;

For i:=1 to spt do
Begin
min:=a[spt];
Vitri:=spt;
For j:=i to spt do
If a[j]Begin
Min:=a[j];
Vitri:=j;
End;
A[vitri]:=a[i];
A[i]:= min;
End;
Writeln(‘ mang sau khi sap xep la’);
For i:=1 to spt do
Writeln(a[i]:6); writeln;
Readln;
End.
2.3.2.2. Mô tả cho giải thuật nổi bọt.
Giải thuật nổi bọt cũng duyệt mảng như giải thuật chọn nhưng so sánh và
hoán vị theo từng cặp phần tử i và i+1.
Lần duyệt đầu tiên bắt đầu từ i=1 đến i= n-1, sau lần duyệt này, các phần tử
có giá trị nhỏ sẽ chuyển lên vị trí đầu, các phần tử có giá trị lớn sẽ chuyển xuống
gần vị trí cuối và phần tử thứ n chứa giá trị lớn.
Lần duyệt thứ 2 cũng bắt đầu từ i=1 đến n-1, so sánh và hoán vị 2 cặp phần
tử thứ i và i+1

10



Tương tự, lần duyệt thứ k cũng sẽ so sánh và hoán vị từng cặp phần tử thứ
i=1 đến n-k+1
Như vậy nếu coi j là chỉ số của phần tử cuối cùng được so sánh với j từ n
giảm dần sau mỗi lần duyệt cho đến khi bằng 2, chúng ta sẽ so sánh cặp phần tử
thứ i và thứ i+1 với i từ 1 đến j-1
Chu trình của giải thuật nổi bọt như sau:
*. Vòng lặp for thứ nhất cho j từ n giảm dần đến 2
*. Vòng lặp for thứ 2 cho i=1 đến j-1.
*. So sánh, nếu phần tử thứ i+1 bé hơn phần tử thứ i thì
*. Hoán vị
Ý tưởng này được thể hiện trong thủ tục sắp xếp nổi bọt sau đây:
Procedure
Noibot(Var a:<kiểu>; n:byte);
Var
i.j:byte;
Begin
For j:=n downto 2 do
For i:=1 to j-1 do
If behon(a[i+1],a[i]) then hoanvi(a[i],a[i+1]);
End;
Số lần so sánh của giải thuật này gồm:
- Lần duyệt đầu tiên, số lần so sánh là n-1.
- Lần duyệt thứ 2, số lần so sánh là n-2
- Lần duyệt thứ k sau khi sắp xếp xong, số lần so sánh là:
(n-1)+(n-2)+..+2+1= n*(n-1) lần.
Độ phức tạp của giải thuật tỉ lệ với bình phương của n, vì vậy giải thuật này chỉ
nên sử dụng với mảng có kích thước nhỏ
Ví dụ: Chương trình sử dụng giải thuật nổi bọt để sắp xếp từ nhỏ đến lớn các
phần tử của một mảng số nguyên.
Program Gtnoibot;

Const
Spt=10;
Var
A:array[1..spt] of integer;
tam, i , j:integer;
Begin
Writeln(‘ sap xep mang bang giai thuat noi bot’);
For i:=1 to spt do
Begin
Write(‘ phan tu’,a[‘,i,’] =’); readln (a[i]);
End;
For i:=1 to spt -1 do
For j:=spt downto i+1 do
If a[j]< a[j-1] then
Begin
tam:=a[j];
11


2.3.2.3

a[j]:= a[j-1];
a[j-1]:=tam;
End;
Writeln(‘ mang sau khi sap xep la’);
For i:=1 to spt do
Writeln(a[i]:6);
writeln;
Readln;
End.

Mô tả cho giải thuật sắp xếp nhanh quicksort.

Giải thuật Quicksort được sử dụng trong trường hợp mảng có số phần tử lớn
và phức tạp, Số lần sắp xếp sắp xếp trung bình của giải thuật này là nlog(n), lớn
nhất là n2 lần.
Nguyên lý sắp xếp của giải thuật này gồm các bước như sau:
a. Chia mảng thành 2 phần ( trái, phải) lấy một giá trị x ở giữa để làm
chuẩn so sánh.
b. Tìm một phần tử A ở phần bên phải có giá trị lớn hơn x.
c. Tìm một phần tử B ở phần bên trái có giá trị nhỏ hơn x
d. Hoán vị 2 phần tử A và B
e. Tiếp tục thực hiện như thế cho đến khi đạt được một mảng mà phần bên
trái là các phần tử có giá trị nhở hơn x, phần bên phải là các phần tử có
các giá trị lớn hơn x
f. Trong mỗi phần lại chia thành 2 phần nhỏ và thực hiện việc sắp xếp như
trên cho các phần tử nhỏ này. (bước b,c,d,e).
g. Sau khi thực hiện bước f, mảng chia thành 4 phần. Tiếp tực thực hiện
bước (f,b,c,d,e) để chia mảng thành 8 phần vv…cho đến khi không thể
chia được nữa việc sắp xếp mảng cũng hoàn tất.
- Dưới đây tôi mổ tả cú pháp đệ quy cho một đoạn của mảng từ phần tử thứ
L( bên trái) đến phần tử thứ R ( bên phải)
+ Lấy giá trị của phần tử ở giữa mảng [(L+R) div 2] gán cho biến x để làm
chuẩn so sánh.
+ Sử dụng vòng lặp for với biến i có trị ban đầu là L ( thứ tự của các phần tử ở
phần bên trái).
+ Sử dụng vòng lặp For với biến j có giá trị ban đầu là R( Thứ tự của các phần
tử ở phần bên phải).
+ Sử dụng vòng lặp Repeat cho đến khi i>j
• Chừng nào a[i]• Chừng nào x

• Sử dụng điều kiện if , nếu i< = j thì :
 Hoán vị 2 phần tử a[i] và a[j]
 Tăng i
 Giảm j

12


Cho đến khi i>j. Tới đây, chúng ta được 2 phần:L, j và i, R ( vì i>j). Phần L, j là
các phần tử có các giá trị nhỏ hơn các giá trị của các phần tử ở phần i, R. Tiếp
tục thực hiện giải thuật trên với 2 phần bằng cú pháp đệ quy.
+ Sắp xếp mảng từ phần tử thứ L đến phần tử thứ j
+ Sắp xếp mảng từ phần tử thứ i đến phần tử thứ R.
+ Chấm dứt.
Thủ tục minh họa cho giải thuật trên.
Procedure Quicksort( Var a:<kiểu mảng>; N:<Kiểu>);
Procedure Sort (L, R: byte);
Var
I,j:byte;
x:< Kiểu mảng>;
Begin
x:= a[(L+R) div 2];
i:= L;
J:=R;
Repeat
While behon(a[i],x) do
Inc(i);
While behon(x,a[j]) do
Dec(j);
Until i>j;

If LSort (L,j);
If iSort (i,R);
End;
Begin
Sort(1,N);
End;
Ví dụ: Sử dụng giải thuật Quicksort để sắp xếp mảng có n phần tử.
Program Gtquicksort;
Uses crt;
Const
Max = 1000;
Type
Mang= array[1..max] of integer;
Var
A: mang;
I:integer;
Procedure hoanvi(var m,n :integer);
Var
Tam:byte;
Begin
Tam:=m;
13


m:=n;
n:=tam;
End;
Procedure xuat;

Var
i:integer;
Begin
Clrscr;
For i:=1 to max do
Begin
If i mod 240 = 0 then
Readln;
Write(‘ ‘ , a[i]:6, ‘ ‘);
End;
End;
Procedure nhap;
Var
i:integer;
Begin
For i:=1 to max do
A[i]:= random(1000);
Writeln; Readln;
End;
Procedure quicksort(Var a: mang; Lo, Hi: integer);
Procedure Sort (left, right:integer);
Var
i,j,x:inetger;
Begin
i:=left; J:=right;
X:=a[(left +right) div 2];
Repeat
While a[i]< x do
Inc(i);
While x< a[j] do

Dec(j);
If i<= j then
Begin
Hoanvi(a[i],a[j]);
Inc(i);
Dec(j);
End;
Until i>j;
If left < j then
Sort(left,j);
If i< right then
14


Sort (i, right);
End;
Begin
Sort (Lo, Hi);
End;
Begin
Clrscr;
Writeln(‘ giai thuat Quicksort’);
Nhap;
Quicksort (a,1,max);
Xuat;
Readln;
2.4

End.
Hiệu quả của đề tài nghiên cứu

Sau khi áp dụng đề tài nghiên cứu: “ SỬ DỤNG GIẢI THUẬT SẮP

XẾP GIÚP HỌC SINH GIẢI CÁC BÀI TOÁN TRONG LẬP TRÌNH
THEO ĐỊNH HƯỚNG PHÁT TRIỂN NĂNG LỰC ” đã giúp tôi rất nhiều
trong quá trình giảng dạy trên lớp, đặc biệt trong việc bồi dưỡng học sinh
giỏi môn Tin học, bằng cách phân tích giảng dạy như trên, các em học sinh
dễ dàng nắm vững các giải thuật sắp xếp nâng cao, giúp học sinh áp dụng
giải được nhiều bài toán hay và khó khi lập trình, sử lý được dữ liệu lớn
với thời gian ngắn nhất, đảm bảo kiểm tra được hết cho các text đề ra.
Kết quả thu được vì hạn chế số lượng trang trong đề tài sáng kiến này, tôi
xin trình bầy qua bài tập ví dụ tiêu biểu mà tôi đã hướng dẫn giúp học sinh thực
hiện.

Bài toán 1: Tìm giá trị nhỏ thứ K.
Cho dãy a1, a2, …, an. Các số đôi một khác nhau và số nguyên dương
k (1 <= k<= n). Hãy đưa ra giá trị nhỏ thứ k trong dãy.
Ví dụ, cho dãy 5 phần tử: 5, 7, 1, 3, 4 và k = 3 thì giá trị nhỏ thứ k là 4.
Giải: Sắp xếp dãy theo giá trị tăng dần, số đứng thứ k của dãy là giá trị nhỏ
thứ k. Bài toán này nếu n<= 5000 có thể sử dụng theo thuật toán nổi bọt
như sách giáo khoa lớp 10 đưa ra, nhưng nếu n >= 5000 thì nên sử dụng
thuật toán sắp xếp nhanh.
Ta có thể tìm được giá trị nhỏ thứ k hiệu quả hơn không cần sắp xếp
lại cả dãy số, cụ thể như sau
+ Trong thuật toán sắp xếp nổi bọt ta chỉ cần sắp xếp đến phần tử thứ
k , khi đó phần tử thứ k chính là phần tử có khóa nhỏ thứ k
For i:=1 to k do // i chạy đến k
For j:=n downto i+1 do
If a[j-1]>a[j] then
Begin
Tmp:=a[j];

15


A[j]:=a[j-1];
A[j-1]:=tmp;
End;
+ Trong thuật toán QuickSort ta thấy rằng:
• Nếu kkhông ảnh hướng đến vị trí thứ k.
• Nếu L<= h< k thì đoạn từ L đến h cũng không cần sắp xếp vì đoạn
này không ảnh hưởng đến vị trí thứ k.
• Nếu L<=k<=h thì ta sẽ xử lý đoạn này.
Procedure Quicksort(L,h:longint);
Var
i,j:longint;
x,tmp: longint;
Begin
If (L<= k) and (h>k) then
Begin
i:=L;
J:=h;
x:=a[(L+h) div 2];
Repeat
While a[i]While a[j]> x do dec(j);
If i<=j then
Begin
Tmp:=a[i];
A[i]:=a[j];
A[j]:=tmp;

Inc(i);
Dec(j);
End;
Until i>j;
If L< j then Quicksort(L,j);
If iEnd;
End;
- Sau khi gọi và thực hiện thủ tục Quicksort(1,n) thì số đứng thứ k
chính là giá trị nhỏ thứ k.
Bài toán 2. Người ta định nghĩa một dãy số bằng phẳng là tất cả các số
trong dãy đó đều bằng nhau, nếu dãy số đó chỉ gồm một số thì cũng được
gọi là dãy số bằng phẳng có độ dài bằng 1. Cho dãy số nguyên a 1, a2,.., an.
Hãy tìm độ dài lớn nhất của một dãy con( Không nhất thiết là các phần tử
16


liên tiếp) là dãy bằng phẳng. Ví dụ dãy:1, 1, 3, 2, 2, 3, 3, 3, 2 thì dãy con
bằng phẳng liên tiếp có độ dài lớn nhất là 4( đó là dãy 3,3,3,3)
Dữ liệu: Vào từ file BAI2.INP gồm
- Dòng đầu tiên là số nguyên dương N ( N <= 106)
- Dòng thứ 2 là N số nguyên dương a1, a2, .., an ( |ai| <= 109)
Kết quả: Ghi ra file BAI2.OUT gồm một số nguyên duy nhất là kết quả của
bài toán

BAI2.INP
BAI2.OUT
9
4
113223332

- Lời giải sau sử dụng thuật toán sắp xếp nhanh Quick sort cho kết
quả tối đa yêu cầu và lấy đủ điểm.
Const Nmax=1000000;
Var f,g:text;
A:Array[1..Nmax+3] of longint;
i,j,N,d,Max:Longint;
Procedure
QuickSort(l,r:Longint);
Var i,j,tg,mid:Longint;
Begin
i:=l;
j:=r;
mid:=a[(l+r) div 2];
Repeat
While a[i] < mid do inc(i);
While a[j] > Mid do dec(j);
If i<=j then
Begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
inc(i);
Dec(j);
End;
Until i>j;
If i < r then quicksort(i,r);
If j > l then Quicksort(l,j);
End;
Begin
Assign(f,'BAI2.INP'); Reset(f);

Assign(g,'BAI2.OUT'); Rewrite(g);
Readln(f,N);
For i:=1 to n do
17


Read(f,a[i]);
Quicksort(1,N);
Max:=0;
d:=1;
For i:=1 to n-1 do
begin
If a[i]=a[i+1] then d:=d+1
Else
Begin
If d>max then max:=d;
d:=1;
End;
End;
If d>max then max:=d;
Write(g,Max);
Close(f); Close(g);
End.
Bài toán 3: Trường THPT Ba Đình có n học sinh đang xếp thành một hàng
dọc. Các học sinh được đánh số từ 1 đến n. Ban đầu, học sinh i đứng ở vị trí thứ
i trong hàng. Mỗi học sinh i có hai giá trị đặc trưng là ai và bi. Độ không hài lòng
của học sinh i bằng tích của ai và số lượng học sinh đứng bên trái học sinh i cộng
với tích của bi và số lượng học sinh đứng bên phải học sinh i. Một cách tổng
quát, nếu học sinh i đứng ở vị trí thứ j, độ không hài lòng của học sinh này là
ai*(j-1)+bi*(n-j). Hiệu trưởng giao cho bạn nhiệm vụ là tìm một cách xếp hàng

sao cho tổng độ hài lòng của tất cả học sinh là nhỏ nhất có thể.
Dữ liệu: Từ file BAI3.INP
+ Dòng đầu tiên chứa một số nguyên n (1≤ n ≤10 5 ) - số học sinh trong hàng đợi.
+ Mỗi dòng trong n dòng sau chứa hai số nguyên a i và bi (1≤ ai, bi ≤ 108)- hai giá
trị đặc trưng của học sinh i.
Kết quả: Ghi ra file BAI3.OUT: Một số nguyên duy nhất là tổng độ hài lòng nhỏ
nhất tìm được.
Ví dụ:
BAI3.INP
BAI3.OUT
BAI3.INP
BAI3.OUT
3
12
4
25
42
24
23
33
61
71
23

Lời giải sau sử dụng thuật toán sắp xếp nhanh Quick sort cho kết
quả tối đa yêu cầu và lấy đủ điểm.
Program BAI3;
Const
18



t1='BAI3.INP';
t2='BAI3.OUT';
max=round(1e5);
Var
f1,f2:text;
c:array[1..max] of int64;
n,i:longint;
s,a,b:int64;
procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l; j:=r;
x:=c[(l+r) div 2];
repeat
while c[i]while xif not(i>j) then
begin
y:=c[i]; c[i]:=c[j]; c[j]:=y; inc(i); j:=j-1;
end;
until i>j;
if lsort(l,j);
if isort(i,r);
end;
Begin
assign(f1,t1); reset(f1);

readln(f1,n);
s:=0;
for i:=1 to n do
begin
readln(f1,a,b);
s:=s+b*n-a;
c[i]:=a-b;
end;
sort(1,n);
for i:=1 to n do s:=s+c[i]*(n-i+1);
assign(f2,t2); rewrite(f2);
write(f2,s);
close(f1); close(f2);
19


end.
Bài toán 4 : Người ta có N đoạn dây xích (N <= 20000), mỗi đoạn dây xích là
chuỗi các mắt xích được nối với nhau. Mỗi đoạn dây xích có không quá 1000
mắt xích. Bằng cách cắt ra một mắt xích, sau đó hàn lại, ta có thể nối hai đoạn
xích thành một đoạn xích.

Yêu cầu: Hãy tìm số mắt xích ít nhất cần cắt ra để nối các đoạn xích lại
thành một đoạn xích duy nhất.
Dữ liệu vào: Trong tệp noixich.inp dòng đầu tiên ghi số N là số đoạn xích.
Dòng tiếp theo ghi N số nguyên dương là số mắt xích của mỗi đoạn, số nguyên
dương này luôn lớn hơn hoặc bằng 1 và nhỏ hơn 2000.
Dữ liệu ra: Trong tệp noixich.out ghi số lượng mắt xích ít nhất cần cắt ra
để nối các đoạn xích thành 1 dây xích duy nhất.
Ví dụ:

NOIXICH.INP
NOIXICH.OUT
5
3
13369
Giải thích: Ban đầu có 5 đoạn xích, đoạn 1 có 1 mắt xích, đoạn 2 có 3 mắt xích,
đoạn 3 có 3 mắt xích, đoạn 4 có 6 mắt xích, đoạn 5 có 9 mắt xích.
Ta cắt đoạn 1 ra 1 mắt xích, cắt đoạn xích thứ 2 ra 2 mắt xích. Như vậy chỉ cần
cắt 3 mắt xích ta có thể nối các đoạn đã cho thành 1 dây xích duy nhất.

- Chương trình thực hiện sử dụng giải thuật sắp xếp như sau:
Program noixich;
const fi='noixich.inp';
fo='noixich.out';
Var
n,m,sd,t :Integer;
A :Array[1..20000] of Integer;
Procedure nhapdl;
var i :Integer;
begin
readln(n);
for i:=1 to n do read(a[i]);
end;
procedure Swap(i,j :Integer);
var
tmp :Integer;
begin
tmp:=A[i]; A[i]:=A[j]; A[j]:=tmp;
20



end;
procedure Sort(l,h :Integer);
var
i,j,k :Integer;
begin
if (l>=h) then Exit;
i:=l; j:=h; k:=A[(l+h) div 2];
repeat
while (A[i]while (A[j]>k) do Dec(j);
if (i<=j) then
begin
if (iInc(i); Dec(j);
end;
until (i>j);
Sort(l,j); Sort(i,h);
end;
procedure Solve;
var
k :Integer;
begin
sd:=n-1;
t:=0;
for k:=1 to n do
begin
t:=t+a[k];
if tif t=sd then begin write(t); exit; end;

if t>sd then begin t:=t-a[k];break;end;
end;
writeln(sd);
end;
Begin
Assign(Input,fi); Reset(Input);
Assign(Output,fo); Rewrite(Output);
nhapdl; Sort(1,n); Solve;
Close(Input); Close(Output);
End.

3

Kết luận và đề xuất
21


3.1

Kết luận.

Qua thực tế giảng dạy tại các lớp 10A, 10K, 10G, 11A, 11K, 11G trường
THPT Ba Đình, sau khi áp dụng đề tài bản thân tôi đã có thêm nhiều kinh
nghiệm và kỹ năng để giảng dạy và truyền đạt cho các em những bài học bổ ích
và lý thú. Được các đồng nghiệp ủng hộ.
Từ kết quả học tập của các em tôi nhận thấy việc kết hợp cùng một lúc
nhiều phương pháp dạy học là một việc làm hết sức cần thiết, phù hợp với yêu
cầu thực tiễn.
Với chủ đề này cá nhân tôi vẫn đang tiếp tục nghiên cứu, áp dụng sâu và
rộng cho các chuyên đề tiếp theo ở mức độ nâng cao hơn. Mục đích để mang lại

cho các em học sinh của tôi những tiết học bổ ích, khai thác tính sáng tạo, tạo
hứng thú cho các em yêu thích và say mê học môn lập trình Tin Học nói riêng
và môn Tin Học nói chung.
3.2 Kiến nghị
Nhà trường cần có sự đầu tư nâng cấp thêm cho phòng máy thực hành của
học sinh, bổ xung thêm tài liệu, tranh minh hoạ, mô hình dạy học lập trình trong
nhà trường, để các em có thêm tài liệu tham khảo, giáo viên nghiên cứu bài dạy.
Đề tài sáng kiến trên tôi đã áp dụng cho kết quả rất khả quan trong công
tác giảng dạy của mình, tuy nhiên sáng kiến này không thể tránh khỏi những
thiếu sót, hạn chế của cá nhân tôi. Vậy tôi kính mong nhận được sự đóng góp
của các quý đồng nghiệp, những người quan tâm nội dung này để sáng kiến
hoàn thiện hơn.
Tôi xin chân thành cảm ơn sâu sắc!
Nga sơn, ngày 28 tháng 6 năm 2020
Tôi xin cam đoan đây là sáng kiến kinh
nghiệm của mình viết, độc lập nghiên
cứu, không sao chép nội dung của
người khác.
Xác nhận của thủ trưởng đơn vị

Người thực hiện

Vũ Thị Huệ

22


TÀI LIỆU THAM KHẢO
1. Bùi Việt Hà, Lập trình Pascal- Nhà xuất bản giáo dục, tháng 8 năm 2002.
2. Nguyễn Đình Tê - Hoàng Đức Hải, Giáo trình lý thuyết và bài tập Pascal Nhà xuất bản Giáo Dục – 2000.

3. Nguyễn Tô Thành, Lập trình nâng cao trên ngôn ngữ Pascal - Nhà xuất bản
Đai Học Quốc Gia Hà Nội.
4. Quách Tuấn Ngọc, Ngôn Ngữ lập trình Pascal - Nhà xuất bản Đại Học Bách
Khoa Hà Nôi, năm 1990.
5. Hồ Sĩ Đàm – Đỗ Đức Đông – Lê Minh Hoàng – Nguyễn Thanh Hùng, Tài
liệu chuyên Tin Học quyển 1 - Nhà xuất bản Giáo Dục Việt Nam.

23


DANH MỤC
SÁNG KIẾN KINH NGHIỆM ĐÃ ĐƯỢC HỘI ĐỒNG SÁNG KIẾN KINH
NGHIỆM NGHÀNH GIÁO DỤC VÀ ĐÀO TẠO TỈNH VÀ CÁC CẤP
CAO HƠN XẾP LOẠI TỪ C TRỞ LÊN
Họ và tên tác giả: Vũ Thị Huệ
Chức vụ và đơn vị công tác: Giáo viên trường THPT Ba Đình
Cấp đánh giá
Kết quả
Năm học
TT
Tên đề tại SKKN
xếploại
đánh giá
đánh giá
(Nghành GD cấp
xếp loại
xếp loại
huyện/tinh; tỉnh...)
Phối hợp nhiều phương
pháp giúp học sinh sử dụng

tham số trong chương trình
con
1
Tỉnh
C
2008-2009

2

3

4

5

Xây dựng hệ thống bài tập
luyện kỹ năng cho học sinh
chuyển đổi giữa cấu trúc lặp
While ...Do và For..Do
Phân bậc hệ thống bài tập
xây dựng thuật toán giải bài
toán trên máy tính.
Một số giải pháp luyện kỹ
năng giúp học sinh sử dụng
chương trình con trong lập
trình.
Đổi mới phương pháp dạy
học sinh làm bài tập về
chương trình con trong lập
trình.


Tỉnh

C

2012-2013

Tỉnh

C

2015-2016

Tỉnh

C

2017- 2018

Tỉnh

C

2018- 2019

24




×