1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

24 68 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 401,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

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

Trang 2

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

Trang 3

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 quantrọng trong cuộc sống nói chung và trong Tin Học nói riêng Ý nghĩa và côngdụ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 tronglậ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ũinhọ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ó ứngdụ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ôimạ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ủamì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êubiể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ềmnă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ươngtrì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ườngTHPT Ba Đình – Nga Sơn – Thanh Hóa Dạy cho các em biết và hiểu được việcviế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ínhkhô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ắpxế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ápnghiê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ươngcủ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áccủ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 quantrọng

Trang 4

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 - NgaSơ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átcủ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ắpxế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ờigian 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ậttoán sắp xếp nhanh( Quick Sort) được bình chọn là một trong 10 thuật toán tiêubiểu của thế kỷ XX [5] Trong các chương trình giảng dạy Tin Học ở các cấphọ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ácphầ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 choviệ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ủ đạotrong 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ằngtráo đổi ( Exchange Sort) hay còn có tên gọi khác là sắp xếp nổi bọt( BubbleSort) 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ánvớ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ăngcường đổi mới dạy học Bộ giáo dục và đào tạo đã tập trung chỉ đạo thông quanghị 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à đadạ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 chocá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 địnhhướ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

Trang 5

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 đượclắ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ônhọ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 hainê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

Để đá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ựcthi 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ếptiê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ớin-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ắpxếp sẽ giản dần

Trang 6

- 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ắpxế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:

- 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ổibọ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ạnmảng đã có thứ tự để đưa đoạn đó vào phần mảng đã sắp xếp thứ tự Với cáchcả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ầnduyệ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:=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

Trang 7

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 nnhỏ.

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ệnh(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ụcnhư 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.26M= 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.22M= 1.66n1.22Giả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 rPhâ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.87nM= 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 )

Trang 8

- 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í đứngtrướ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 sauchố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ơnhoặ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ạncon, 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ácthô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ới1/3n thời gian Dó đó đây là giải thuật tốt nhất và được đánh giá là một trong 10thuậ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ó 2thao 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ậtsắ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ùngkiểu, Pascal ta sử dụng các toán tử so sánh (toán tử quan hệ) Nhưng với cáckiể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áctoá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

Trang 9

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>) ;

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ặcgiả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ớicá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ậtchọn trực tiếp như sau

Procedure Chon(Var a:<kiểu>; n :byte);

Trang 10

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ểukhi 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

min, vitri, i, j:integer;

Begin

Writeln(‘ sap xep mang bang giai thuat chon’);

For i:=1 to spt do

BeginWrite(‘ phan tu’,a[‘,i,’] =’); readln (a[i]);

End;

For i:=1 to spt do

Begin min:=a[spt];

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ốnggầ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

Trang 11

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ừ ngiả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;

BeginFor 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

VarA:array[1 spt] of integer;

tam, i , j:integer;

BeginWriteln(‘ sap xep mang bang giai thuat noi bot’); For i:=1 to spt do

BeginWrite(‘ 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];

Trang 12

Readln;

End

2.3.2.3 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ớnnhấ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àmchuẩ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]<x thì tăng i

• Chừng nào x<a[i] thì giảm j

• 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

Ngày đăng: 14/07/2020, 12:29

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w