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

Sáng kiến kinh nghiệm: Hướng dẫn học sinh giải bài toán sắp xếp - Tin học 8

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 (2.49 MB, 31 trang )

Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Nguyễn Thị Lan

Họ và tên

: Nguyễn Thị Lan

Chức vụ

: Giáo viên

Trường

: Trung học cơ sở Trần Cao

Tên đề tài SKKN:
HƯỚNG DẪN HỌC SINH GIẢI BÀI TOÁN SẮP XẾP
TIN HỌC 8.

Phần I. PHẦN MỞ ĐẦU
I. ĐẶT VẤN ĐỀ
1. Lí do chọn đề tài
Hiện nay trong hầu hết các lĩnh vực hệ lưu trữ, quản lý dữ liệu, thao tác
tìm kiếm thường được thực hiện nhiều nhất để khai thác thông tin một cách
nhanh chóng và chính xác (ví dụ như: tra cứu từ điển, tìm sách trong thư viện,
tra cứu thơng tin về nhân viên trong một cơ quan, tra cứu điểm thi của một học


sinh trong một trường học,…). Để đạt được mục tiêu tìm kiếm một cách nhanh
chóng thì dữ liệu cần phải được sắp xếp sẵn, ngăn nắp, khoa học theo một trật
tự, một hệ thống nhất định.
Khi xây dựng một hệ thống quản lý thơng tin trên máy tính, bên cạnh các
thuật tốn tìm kiếm, các thuật tốn sắp xếp dữ liệu cũng là một trong các chủ đề
được quan tâm hàng đầu.
Trong khi đó, với học sinh bậc THCS, việc lập trình giải quyết các bài
tốn, đặc biệt là các bài tốn sắp xếp cịn rất lúng túng, phương pháp cịn nghèo
nàn, thuật tốn cịn đơn điệu, điều này dẫn đến việc giải quyết các bài toán sắp
xếp cũn rt nhiu hn ch.

Năm học 2014 - 2015
Trang: 3


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Nguyễn
Xut phỏt từ thực trạng của
vấn đề trên,ThÞ
sau mộtLan
thời gian dài tìm hiểu,

nghiên cứu tôi xây dựng chuyên đề: “Hướng dẫn học sinh giải bài toán sắp xếp”
với mong muốn mang lại cho các em một cái nhìn tổng thể về bài tốn sắp xếp
nói chung, các thuật tốn sắp xếp nói riêng, từ đó có thể tiếp cận được với các
bài tốn quản lý thơng tin sau này.

2. Đối tượng nghiên cứu và phạm vi nghiên cứu
a) Đối tượng nghiên cứu
- Học sinh lớp 8 trường THCS Trần Cao
b) Phạm vi nghiên cứu:
Tìm hiểu và vận dụng các lý thuyết cơ bản về một số phương pháp sắp
xếp như: phương pháp chọn trực tiếp (Selection Sort), chèn trực tiếp (Insertion
Sort), sắp xếp nổi bọt (Bubble Sort), sắp xếp kiểu vun đống (Heap Sort), sắp xếp
nhanh (Quick Sort), sắp xếp với độ dài bước giảm dần (Shell Sort),…
Áp dụng đối với:
- Phần: Câu lệnh lặp (xác định); Lặp với số lần chưa biết trước; Làm việc
với dãy số; Kiểu dữ liệu mảng.
- Bộ môn Tin học lớp 8.
II. PHƯƠNG PHÁP TIẾN HÀNH
Chuyên đề chủ yếu sử dụng các phương pháp nghiên cứu sau:
- Phương pháp nghiên cứu lí luận: Nghiên cứu các vấn đề mang tính lí
luận có liên quan đến đề tài (Muốn học tốt lập trình phải có thuật tốn tốt, muốn
có thuật tốn tốt địi hỏi học sinh phải tiếp cận với nhiều dạng bài toán, nhiều
cách giải quyết bài toán,...)
- Phương pháp điều tra: Với phương pháp này tôi tiến hành điều tra học
sinh bằng các phiếu trắc nghiệm (chỉ rõ tính đúng, sai của thuật tốn, dự đoán
kết quả của thuật toán), các bài thực hành trên phịng máy để nắm chắc trình độ
nhận thức, kỹ năng thực hành của từng đối tượng học sinh. Trên cơ sở đó làm
nền tảng đối chiếu kết quả trước và sau khi thc hin chuyờn .
Năm học 2014 - 2015
Trang: 4


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan


đGiáo án Tin học 9

Nguyễn
Thị
- Phng pháp phỏng vấn:
Thông qua việc
trao Lan
đổi trực tiếp thẳng thắn

với học sinh về các biện pháp giúp các em thực hành tốt bộ môn, tôi đã nhận
được những mong muốn, những băn khoăn, ..., và cả những ý kiến đóng góp của
các em. Cũng từ đây tơi hình thành nên các giải pháp cho chuyên đề.
- Phương pháp tạo tình huống: Thơng qua các bài tập tạo tình huống, các
bài tập có tính chất minh chứng tơi dần dần dẫn các em vào vấn đề và hướng dẫn
các em tìm cách giải quyết.
- Phương pháp quan sát, đánh giá, tổng hợp: Thơng qua q trình quan sát
học sinh thực hành, đánh giá, tổng hợp kết quả thực hành giúp tôi có giải pháp
để thực hiện và điều chỉnh chuyên đề của mình cho phù hợp và có hiệu quả nhất.

Phần II. NỘI DUNG
I. MỤC TIÊU CỦA ĐỀ TÀI
- Trình bày được ý tưởng, thuật giải (thuật toán) của một số phương pháp
sắp xếp thông dụng.
- Giới thiệu được Code diễn đạt thuật giải.
- Mơ tả được thuật tốn của phương pháp bằng ví dụ cụ thể.
II. CÁC GIẢI PHÁP THỰC HIỆN
Một số thuật toán sắp xếp:
1. Sắp xếp chọn trực tiếp (Selection Sort)
2. Sắp xếp chèn trực tiếp (Insertion Sort)

3. Sắp xếp nổi bọt (Bubble Sort)
4. Sắp xếp phân hoạch (Quick Sort)
5. Sắp xếp với bước giảm dần (Shell Sort)
6. Sắp xếp vun đống (Heap Sort)
1. Sắp xếp chọn trực tip (Selection Sort)
í tng:
Năm học 2014 - 2015
Trang: 5


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Nguyễn
Thị
- Chn phần tử nhỏ nhất trong
n phần tử đầu,
đưa Lan
phần tử này về vị trí đầu

của dãy. Tiếp tục q trình với n-1 phần tử còn lại và bắt đầu từ vị trí thứ 2. Lặp
lại q trình trên cho dãy gồm n-1 phần tử cịn lại.
- Thuật tốn thực hiện n-1 lần để lần lượt đưa phần tử nhỏ nhất trong dãy
hiện hành về vị trí dẫn đầu.
 Thuật tốn:
Đầu vào:
n – số phần tử mảng
a – mảng chứa các phần tử bất kỳ

Đầu ra:
a- mảng đã được sắp xếp tăng dần
Bước 1: i = 0
Bước 2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n-1]
Bước 3: Hốn vị a[i] với a[min]
Bước 4:
• nếu i• ngược lại thì n-1 phần tử đã được sắp xếp => Dừng thuật toán
 Cài đặt (code):

Type mang:array[1..20] of integer;
Function SelectionSort(a:mang, n:integer): integer;
Var i, j, vtmin, tam: integer;
Begin
Writeln(‘------SAP XEP CHON TRUC TIEP------);
For i1 to n-1 do
Begin
Năm học 2014 - 2015
Trang: 6


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Vtmini;

Nguyễn Thị Lan


For j≔i+1 to n do
If a[vtmin]>a[j] then vtmin≔j;
{Hoan doi vi tri cua a[i] va a[vtmin]}
Tam≔a[i];
A[i]≔a[vtmin];
A[vtmin]≔tam;
End;
Writeln(‘Day so sau khi sap xep la:’);
For i≔1 to n do Write(a[i],’

’);

End;

 Ví dụ minh họa:
Cho dãy số (mảng a):
12

2

8

5

1

6

4


15

Yêu cầu: Sắp xếp dãy số tăng dần.
Mơ tả các bước chạy khi thực hiện thuật tốn với dãy trên:
i=0 => j = 1  7 và vtmin = 4 => Hoỏn i a[0] v a[4]

Năm học 2014 - 2015
Trang: 7


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Năm học 2014 - 2015
Trang: 8

Ngun ThÞ Lan

Ngun ThÞ Lan


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Nguyễn Thị Lan

2. Sp xp chốn trc tip (Insertion Sort)

í tng:

Năm häc 2014 - 2015
Trang: 9


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Thị Lan
Gi sử có dãy a0, a1,…,aNgun
i-1 đã được sắp xếp. Ý tưởng của thuật toán là

chèn thêm phần tử mới ai vào vị trí thích hợp của đoạn a 1…ai-1 sao cho được dãy
mới a1…ai đã được sắp xếp
Nguyên tắc sắp xếp như sau: đoạn gồm phần tử a0 đã được sắp xếp, thêm
a1 vào được a0,a1 đã được sắp xếp, tiếp tục thêm a2 vào được a0, a1, a2 đã sắp
xếp…tiếp tục để thêm an vào để được a0,a1,…,an đã sắp xếp.

 Thuật toán:
Đầu vào:

n – số phần tử mảng
a – mảng chứa các phần tử bất kỳ

Đầu ra:

a- mảng đã được sắp xếp tăng dần


Bước 1: i=1 //giả sử a[0] đã được sắp xếp
Bước 2: x=a[i], tìm vị trí pos thích hợp trong đoạn từ a[0] đến a[i-1] để chèn a[i]
vào
Bước 3: đổi chỗ các phần tử từ a[pos] đến a[i-1] sang phải một vị trí để được vị
trí chèn a[i] vào
Bước 4: chèn a[i] vào vị trí pos tìm được bằng cách gán a[pos]=a[i]
Bước 5: i=i+1
Nếu i<n => lặp lại bước 2
Ngược lại => Dừng thuật toán
 Cài đặt:

Type mang:array[1..20] of integer;
Function InsertionSort(a:mang, n:integer): integer;
Var i, j, pos, x: integer;
Begin
Writeln(------SAP XEP CHEN TRUC TIEP------);
Năm học 2014 - 2015
Trang: 10


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

For i2 to n do

Ngun ThÞ Lan


Begin
X≔a[i]; {Luu gia tri cua phan tu a[i] de tranh khi de khi roi cho}
Pos≔i-1;
While (pos >= 1) and (a[pos]>x) do
Begin
A[pos+1]≔a[pos];
Pos≔pos-1;
End;
A[pos+1]≔x; {chen x vao day}
End;
Writeln(‘Day so sau khi sap xep la:’);
For i≔1 to n do Write(a[i],’

’);

End;
 Ví dụ minh họa:
 Cho dãy số a:
a = 12

2

8

5

1

6


4

15

Sắp xếp dãy tăng dần
Mô tả các bước chạy khi thực hin thut toỏn vi dóy trờn:

Năm học 2014 - 2015
Trang: 11


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Năm học 2014 - 2015
Trang: 12

Ngun ThÞ Lan

Ngun ThÞ Lan


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Nguyễn Thị Lan


3. Sắp xếp nổi bọt (Bubble Sort)
Ý tưởng:
Xuất phát từ đầu dãy hay cuối dãy và tiến hành đổi chỗ cặp phần tử kế cận
nhau để đưa phần tử nhỏ hơn hoặc lớn hơn về vị trí cao nhất hay thấp nhất trong
dãy. Sau khi đã chuyển vị tjrí này khơng xét nữa => Lặp lại q trình này khi
dãy khơng cịn phần tử nào nữa
 Thuật tốn:
Bước 1: i = 0
Bước 2: j = n-1 //duyệt từ cuối đến pt th i
Trong khi j>i thc hin
Năm học 2014 - 2015
Trang: 13


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Thị
nu a[j] < a[j-1] thìNgun
hốn đổi hai phần
tử Lan
j=j-1

Bước 3: i=i+1
Nếu i>=n-1 => Hết dãy và dừng thuật toán
Ngược lại lặp lại bước 2
 Cài đặt:


Type mang = array[1..20] of integer;
Function BubbleSort(a:mang, n:integer): integer;
Var i, j, tg: integer;
Begin
Writeln(‘----SAP XEP NOI BOT ----’);
For i≔1 to n do
For j≔n downto i+1 do
If a[j]Begin
Tg≔a[j];
A[j]≔a[j-1];
A[j-1]≔tg;
End;
End;
 Ví dụ minh họa:
 Cho dãy số a:
a=

2

12

8

5

Yêu cầu: Sắp xp dóy tng dn

Năm học 2014 - 2015

Trang: 14

1

6

4

15


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Năm học 2014 - 2015
Trang: 15

Ngun ThÞ Lan

Ngun ThÞ Lan


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Năm học 2014 - 2015
Trang: 16

Ngun ThÞ Lan


Ngun ThÞ Lan


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Nguyễn Thị Lan

4. Sắp xếp dựa trên phân hoạch – Quick Sort
Ý tưởng:
+ Phân hoạch dãy a1 a2 …an thành 3 thành phần :
- Dãy con 1 : Gồm các phần tử a1 …ai có giá trị khơng lớn hơn x.(- Dãy con 2 : Gồm các phần tử aj …an có giá trị không nhỏ hơn x.(>x)
- Dãy con 3: ai,..aj=x
+ Với x là giá trị của một phần tử tuỷ ý trong dãy ban đầu.
+ Sau khi phân hoạch, dãy ban đầu được chia làm 3 phần :
ak < x, vớI k=1..i
ak = x, vớI k=i..j
ak > x, vớI k=j..N
 Thut toỏn:
Năm học 2014 - 2015
Trang: 17


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan


đGiáo án Tin học 9

Nguyễn Thị Lan
Giải thuật để sắp xếp một dãy al…ar
Bước 1 : Phân hoạch dẫy al…ar thành các dãy con :
 Dãy con 1 : al…aj < x
 Dãy con 2 : aj+1…ai-1 = x
 Dãy con 3 : ai…ar > x
Bước 2 :
 Nếu (l Nếu (i
Giải thuật để phân hoạch một dãy al…ar thành 2 dãy con:
Bước 1 : Chọn tuỳ ý a[k] làm giá trị mốc l<=k<=r
X = a[k]; i=l, j=r
Bước 2 : Phát hiện và hiệu chỉnh cặp phần tử a[i], a[j] nằm sai chỗ:
Bước 2a :

Trong khi a[i]
Bước 2b :

Trong khi a[j]>x j--;

Bước 2c :

Nếu i
Bước 3 :
Nếu i

Nếu i>=j : dừng.

 Cài đặt:

Type mang = array[1..20] of integer;
{----- Ham hoan vi gia tri hai bien-----}
Function Hoanvi(x,y:integer):integer;
Năm học 2014 - 2015
Trang: 18


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Nguyễn Thị Lan

Var tam:integer;
Begin
Tam≔x;
X≔y;
Y≔tam;
End;

{------------------Ham QuickSort---------------}
Function QuickSort(a:mang; l,r:integer):integer;
Var I, j, x, n:integer;
Begin

Writeln(‘------SAP XEP PHAN HOACH------’);
X≔a[(l+r) div 2];
I≔l;
J≔r;
Repeat
While a[i]While a[j]>x do dec(j);
If (i<=j) then
Begin
Hoanvi(a[i],a[j]);
Inc(i);
Dec(j);
End;
Until (iIf (lIf (iNăm học 2014 - 2015
Trang: 19


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Nguyễn Thị Lan

End;
 Ví dụ minh họa:

Cho dãy số: 12

2

8

5

1

6

4

15

Yêu cầu: Sắp xếp tăng dần.
Mơ tả các bước của thuật tốn:
 Phân hoạch đoạn l=1; r=8; x=a[4]=5
1
2

2

8

5

1
E


6

4

1
5
r=8

l=1
4

2

1

5

8
E

6

1
2

1
5

5


8
E

6

1
2

1
5

5

8
E

6

1
2

1
5

 Phân hoạch đoạn l=1; r=3; x=a[2]=2
4

2


l=1

1
r=3

1

2

4

Phõn hoch on l=5; r=8; x=a[6]=6
1

2

4

5

8
E

6

1
2

l=5


1

2

4

1
5
r=8

5

6

8

1
2

1
5

5

6

8

1


1

Năm học 2014 - 2015
Trang: 20
1

2

4


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Phõn hoch on

Nguyễn ThÞ Lan

Ngun
l=7; r=8;
x=a[7]=12 ThÞ Lan

l=7

r=8

Dừng
5. Sắp xếp với bước giảm dần (Shell Sort)
 Ý tưởng:
Dựa trên ý tưởng sắp xếp theo phương pháp chèn

- Phân chia dãy ban đầu thành những dãy con các phần tử ở cách nhau h vị trí
- Dãy ban đầu : a1 a2 … an được xem như sự xen kẽ các dãy con sau :
- Dãy con thứ nhất : a1 ah+1 a2h+1 …
- Dãy con thứ hai : a2 ah+2 a2h+2 …
….
- Dãy con thứ h

: ah a2h a3h …

 Giải thuật:
Bước 1 : Chọn k khoảng cách h[1], h[2],…,h[k] và i=1.
Bước 2 : Phân chia dãy ban đầu thành các dãy con cách nhau h[i] khoảng
cách. Sắp xếp từng dãy con bằng phương pháp chèn trực tiếp.
Bước 3 : i=i+1;
Nếu i>k : dng.
Nu i<=k : lp li bc 2.

Ci t:
Năm học 2014 - 2015
Trang: 21


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Thị Lan
Gi sử chọn được dãy độ dàiNguyÔn

h[1], h[2],…,h[k],


Procedure ShellSort (a: mang, n:integer, h:mang, k: integer);
Var

step, i, j, x, len: integer;

Begin
for step:=0 to k-1 do
Begin
Len:=h[step];
for i:=len to n-1 do
Begin
X:=a[i];
J:=i-len;
while (x<a[j]) and (j>-1)do //sắp xếp dãy con chứa x
Begin {bằng phương pháp chèn trc tip}
a[j+len]:=a[j];
j:=j-len;
End;
a[j+len]:=x;
End;
End;
End;


Năm học 2014 - 2015
Trang: 22



Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Nguyễn Thị Lan

Nguyễn Thị Lan
6. Sắp xếp vun đống (Heap Sort)
 Định nghĩa Heap:

- Giả sử sắp xếp giảm dần, khi đó Heap được định nghĩa là một dãy các phần tử
a1, a2, ..., an thỏa các quan hệ :
ai <= a2i.
ai <= a2i+1
{(ai, a2i), (ai, a2i+1) là các cặp phần tử liên đới}
- Và có các tính chất sau :
Tính chất 1: Phần tử a1 (đầu Heap) luôn là phần tử nhỏ nhất trong
Heap
Tính chất 2: Cắt bỏ một số phần tử về phía phải của Heap thì dãy
con cịn lại vẫn là một Heap.
 Ví dụ:

 Thuật tốn:
Giải thuật Heapsort trải qua 2 giai đoạn:
- Giai đoạn 1:Hiệu chỉnh dãy số ban đầu thành heap;
- Giai đoạn 2:Sắp xếp dãy số dựa trờn heap:
Năm học 2014 - 2015
Trang: 23



Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Bc 1:

Nguyễn Thị Lan

Thị
Lan
éa phầnNgun
tử nhỏ nhất về vị
trí đúng
ở cuối dãy.

Hốn vị(a1,aN);
Bước 2:Loại bỏ phần tử nhỏ nhất ra khỏi dãy:
N = N-1;
Hiệu chỉnh phần còn lại của dãy từ a1, a2,…, an thành một
heap.
Bước 3: Nếu N > 1 (heap còn phần t ): lp li bc 1.
Ngc li: Dng

Năm học 2014 - 2015
Trang: 24


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.
đGiáo án Tin học 9

Năm học 2014 - 2015

Trang: 25

Ngun ThÞ Lan

Ngun ThÞ Lan


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Nguyễn Thị Lan

* Cài đặt:

Type mang = array[1..20] of integer;
{----Thủ tục hỗ trợ----}
Procedure Shift(a: mang; l,r: integer);
Var

x, i, j, cont: integer;
I: = l; j: = 2*i+1;
cont : = 1;

//(ai,aj),(ai,aj+1)là các phần tử liên đới

x: = a[i ];
while ((j<=r) and (cont)) do

Begin
If (j
{nếu có đủ 2 phần tử liên đới}

If (a[j]>a[j+1) then {xác định phần tử liên đới nhỏ nhất a[j]}
J:=j+1;
{thỏa quan hệ liên đới ,dừng hiệu chỉnh}
if (a[j]>x) then
cont: = 0
Năm học 2014 - 2015
Trang: 26


Hớng dẫn học sinh giải bài toán sắp xếp - Tin học 8.

Nguyễn Thị Lan

đGiáo án Tin học 9

Nguyễn Thị Lan

else
Begin

hoanvị(a[i],a[j]);
i: = j;

{xét tiếp khả năng hiệu chỉnh lan truyền}


j:=2*i+1;
End;
End;
End;
Thủ tục hiệu chỉnh dãy ban đầu a[1], a[2],…, a[n] thành Heap:
Procedure CreateHeap(a:mang, n:integer);
Var i:integer;
Begin
i := n div 2;
while (i > 0) do
Begin
Dec(i);
Shift(a,i,n-1);
End;
 Sắp xếp dãy a[1], a[2], …,a[n] bằng Heap.
void Heapsort(float a[ ],int N)
Var r: integer;
Begin
r := n-1;
Năm học 2014 - 2015
Trang: 27


×