CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAMBằng thực nghiệm với nhiều năm giảng dạy trên lớp và ôn thi học sinh giỏi chúng tôi nhận thấy khi giảng dạy phần sắp xếp và tìm kiếm thường gặp các vấn
Trang 1CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Bằng thực nghiệm với nhiều năm giảng dạy trên lớp và ôn thi học sinh giỏi chúng tôi nhận thấy khi giảng dạy phần sắp xếp và tìm kiếm thường gặp các vấn đề như:
Thứ nhất, việc đưa thuật tìm kiếm và sắp xếp chưa phù hợp Khi học thuật
toán là vào học kỳ I lớp 10 (Bài 4 Bài toán và thuật toán) thì đến HKII lớp 11(bài 11 Kiểu mảng) học sinh mới có bài tập để vận dụng, để tiếp cận thì họcsinh lại phải lật lại kiến thức về thuật toán đã học lớp 10 - những kiến thức họcsinh đã học khá lâu mà không phải học sinh nào cũng nhớ được, chính việc nàylàm vấn đề có thể phức tạp lên và học sinh sẽ trở nên thụ động tiếp thu thôngqua những gì giáo viên truyền đạt, không phát huy được tính chủ động, tích cựccủa mình Trong các đợt ôn thi cho đội tuyển học sinh giỏi thì gần như giáo viênphải truyền đạt lại từ đầu, dẫn đến mất thời gian và hiệu quả đạt được thì khôngcao
Thứ hai, chưa xây dựng cụ thể hệ thống các ví dụ minh họa vận dụng và
bài tập phù hợp với tiến trình phát triển tư duy cho học sinh để học sinh có thểhiểu rõ về tìm kiếm và sắp xếp Ngoài ví dụ mẫu trong sách giáo khoa ra thìkhông có thêm các ví dụ áp dụng cụ thể và nếu có thì học sinh cũng rất khó thựchiện và ghi nhớ vì chỉ dừng lại ở các bài toán biểu diễn dưới dạng liệt kê hoặc sơ
đồ khối chứ chưa thực hiện việc viết chương trình Điều này dẫn đến học sinhhọc thụ động, không hiểu sâu kiến thức, kém linh hoạt khi vận dụng và bài tập
cụ thể Tiến trình lên lớp cũ khi dạy về thuật toán:
- Học sinh xác định bài toán
- Giáo viên nêu ý tưởng
- Giáo viên đưa ra thuật toán bằng liệt kê hoặc sơ đồi khối
Trang 2- Giáo viên mô phỏng ví dụ
Thứ ba, phần mô phỏng thuật toán để học sinh tiếp cận thuật toán một
cách nhanh nhất thường ít được quan tâm và sử dụng Trong tin học lớp 10 cóđưa ra việc mô phòng, tuy nhiên phần diễn đạt chưa sâu và đơn giản dẫn đến họcsinh khó thể hiểu hết được quá trình thực hiện thuật toán Việc đi sâu vào biểudiễn thuật toán bằng sơ đồ khối hoặc liệt kê làm học sinh khó hiểu và nhàmchán
Thứ tư, không có nội dung để học sinh tham gia trong quá trình tìm hiểu
thuật toán, làm mất đi tính chủ động của học sinh khi học thuật toán Thường thìgiáo viên trình bày thuyết trình học sinh nghe giảng tiếp thu
2 Giải pháp mới cải tiến:
Hiểu rõ các tồn tại của cách thức giảng dạy nói trên, nhóm chúng tôi đưa
ra việc xây dựng tài liệu tìm hiểu về sắp xếp và tìm kiếm với cách thức tiếp cậnhoàn toàn mới nhằm khắc phục những tồn tại này, đó là:
- Xây dựng kế hoạch dạy học nhà trường cho phù hợp với nội dung giảngdạy Đưa nội dung của các thuật toán trong đó có thuật toán sắp xếp, tìm kiếmtrong bài 4 tin học 10 vào nội dung giảng dạy trong tin học 11
- Đưa ra nhiều thuật toán sắp xếp, tìm kiếm khác nhau khi ôn học sinhgiỏi Mục đích ngoài để giải quyết các bài toán thì học sinh cũng được rèn luyệncách thức xử lý các công việc không khác nhau ngoài sắp xếp, rèn luyện được tưduy thuật toán tốt hơn
- Cung cấp cho học sinh đầy đủ kiến thức về các thuật toán tìm kiếm, sắpxếp và bổ sung một số kiến thức nâng cao Sau mỗi thuật toán có đưa ra đánhgiá nhận xét đầy đủ để học sinh có cách nhìn tổng quan về thuật toán đang sửdụng
- Các ví dụ minh họa và bài tập được trình bày chi tiết, được sắp xếp mộtcách hợp lý, từ dễ đến khó, bài toán sau có liên hệ với bài toán trước Đặc biệtđưa các dạng câu hỏi trắc nghiệm vào giảng dạy để luyện tập cũng như nâng caokhả năng tư duy nhanh khi tiếp cận thuật toán
- Sử dụng những kiến thức cũ để tiếp cận kiến thức mới thông qua hệthống các bài tập, có thể sử dụng kết quả của bài toán này cho bài toán kia
- Tài liệu đề cập đến nhiều dạng kiến thức khác nhau đặc biệt là các bàitoán thực tiễn Việc làm này một mặt củng cố kiến thức cho học sinh Mặt khácgiúp học sinh có cái nhìn chung nhất, thấy được mối liên hệ giữa tin học và thựctiễn cuộc sống
- Tài liệu cung cấp hệ thống bài tập phong phú Điều này giúp cho họcsinh đứng trước mỗi bài toán phải biết phân tích, đánh giá, so sánh và nhận dạng
để lựa chọn phương pháp giải phù hợp nhất cho bài toán đó Rèn luyện cho họcsinh tính chủ động, tích cực và kỹ năng vận dụng linh hoạt, sáng tạo kiến thức
đã học
Với những cải tiến trên và các kỹ thuật dạy học mới ngày nay thì việc họcsinh nghiên cứu tiếp nhận kiến thức thông qua các hệ thống câu hỏi trắc nghiệmhoặc các biểu diễn môn phỏng sẽ trở nên dễ dàng hơn rất nhiều
III Hiệu quả kinh tế và xã hội
Trang 31 Hiệu quả kinh tế
Thứ nhất, xét về mặt thời gian Để biên soạn một chủ đề hoặc một chuyên
đề dạy học thì giáo viên sẽ phải mất rất nhiều thời gian tìm kiếm, biên tập lại từcác tài liệu trên internet và các sách tham khảo Học sinh có nhu cầu tìm kiếmbài tập để luyện thì cũng phải tìm kiếm trong nhiều tài liệu rồi hệ thống lại Điềunày cũng sẽ mất rất nhiều thời gian Trong khi đó, giáo viên và học sinh có thể
sử dụng ngay tài liệu này để học cũng như sử dụng trong việc ôn thi học sinhgiỏi Nếu cần thì giáo viên chỉ cần bổ sung hàng năm để có được tài liệu phongphú về bài tập cho riêng mình
Thứ hai, xét về tài chính Để viết nên tài liệu này, không kể tài liệu sách
giáo khoa (học sinh và giáo viên nào cũng có), giáo viên sẽ mất rất nhiều giờtruy cập internet, và nhiều giờ để nghĩ ra các bài toán Trong khi với tài liệu này,giáo viên chỉ cần phô tô hoặc in tài liệu này với giá rẻ Nếu tính về hiệu quả kinh
tế sẽ tiết kiệm rất nhiều, vì với tài liệu này ta sẽ còn duy trì trong nhiều năm tiếptheo nữa
2 Hiệu quả xã hội:
Sáng kiến là tài liệu dùng trong việc giảng dạy theo chương trình chuẩnTHPT và là tài liệu tham khảo tốt cho học sinh yêu thích với môn học lập trình,
sử dụng cho quá trình ôn thi học sinh giỏi
Sáng kiến không chỉ giúp giải quyết cho vấn đề đổi mới phương pháp dạyhọc theo hướng tích cực chủ động khi giảng dạy cho học sinh về tìm kiếm vàsắp xếp nói riêng mà nó còn mở ra hướng đổi mới cho việc nghiên cứu cácchuyên đề khác để xử lý các nội dung khó của tin học 11
IV Điều kiện và khả năng áp dụng
Để áp dụng được sáng kiến này thì mỗi nhà trường cần xây dựng một kếhoạch dạy học hợp lý, phù hợp với đối tượng học sinh mà mình giảng dạy
Qua thực nghiệm và tiến hành áp dụng trong các năm học đã qua, tài liệurất hữu ích trong công tác giảng dạy của giáo viên, đặc biệt là việc ôn luyện thihọc sinh giỏi Đồng thời, nâng cao chất lượng giảng dạy và học tập bộ môn tinhọc 11, tạo được hứng thú học tập và góp phần bồi dưỡng năng lực tự học chohọc sinh Vì vậy, sáng kiến có thể áp dụng rộng rãi trong nhà trường nói riêng vàtoàn tỉnh nói chung
Tài liệu này được các đồng nghiệp trong nhà trường đánh giá cao về chấtlượng nội dung và phương pháp dạy học
Chúng tôi xin cam oan m i thông tin nêu trong đoan mọi thông tin nêu trong đơn là trung thực, ọi thông tin nêu trong đơn là trung thực, đoan mọi thông tin nêu trong đơn là trung thực,ơn là trung thực,n l trung th c,à trung thực, ực,úng s th t v ho n to n ch u trách nhi m tr c pháp lu t
đoan mọi thông tin nêu trong đơn là trung thực, ực, ật và hoàn toàn chịu trách nhiệm trước pháp luật à trung thực, à trung thực, à trung thực, ịu trách nhiệm trước pháp luật ệm trước pháp luật ước pháp luật ật và hoàn toàn chịu trách nhiệm trước pháp luật
Trang 4PHỤ LỤC PHẦN I – ĐẶT VẤN ĐỀ
1 Lí do chọn sáng kiến
Trong những năm gần đây vấn đề đổi mới căn bản và toàn diện nền giáodục đã trở thành một vấn đề không chỉ riêng ngành giáo dục mà toàn xã hộiquan tâm, đổi mới để đáp ứng với nhu cầu thực tiễn xã hội ngày nay Một trongnhững sự thay đổi đó là thay đổi phương pháp dạy học từ phương pháp dạy họctruyền thống sang phương pháp dạy học tích cực, từ người giáo viên là trungtâm của mọi hoạt động thì giờ đây với phương pháp dạy học tích cực học sinhtrở thành trung tâm của các hoạt động, từ tiếp thu thụ động sang chủ động, tưduy, sáng tạo; giáo viên chỉ là người định hướng và hỗ trợ Đây là một phươngpháp đã được áp dụng rất thành công ở rất nhiều nước tiên tiến trên thế giới Đểlàm được điều này người thầy cần phải thiết kế những bài giảng, những chuyên
đề cho phù hợp với nội dung kiến thức; phương pháp, phương tiện dạy học phùhợp với từng đối tượng học sinh là một điều hết sức cấp thiết Để qua mỗi phầnhọc, tiết học học sinh thích thú với kiến thức mới, qua đó hiểu được kiến thức đãhọc trên lớp, đồng thời học sinh thấy được tầm quan trọng của vấn đề và việcứng dụng của kiến thức trước hết để đáp ứng những yêu cầu của môn học, sau
đó là việc ứng dụng của nó vào các công việc thực tiễn trong đời sống xã hội
Môn Tin học là một môn học mới mẻ của học sinh THPT, đặc biệt với nộidung tin học 11, với nhiều kiến thức trừu tượng chưa sát thực tế mà đối với họcsinh mới được tiếp xúc với môn lập trình sẽ cảm thấy khó tiếp thu, khó hiểu vàkhông làm được các bài tập áp dụng dẫn đến sự chán nản khi học bộ môn
Xuất phát từ thực tiễn giảng dạy tôi thấy rằng, để thay đổi điều này thì cầnphải xây dựng lại một số nội dung khó của tin học 11 sao cho phù hợp với đốitượng học sinh và tìm lại sự hứng thú với môn học cho các em học sinh Xuất
phát từ cơ sở trên, tôi đã chọn đề tài “Định hướng giảng dạy thuật toán sắp xếp và tìm kiếm trong trường THPT”, nhằm giúp các em dễ tiếp cận các thuật
toán tìm kiếm và sắp xếp hơn, từ đó hiểu rõ được ngữ nghĩa cũng như cách sửdụng các thuật toán này phù hợp với nhiều bài toán khác nhau từ đó tiếp thu tốtnội dung bài học và làm tốt các bài tập áp dụng, cảm thấy yêu thích hơn môn tinhọc nói chung và nội dung về ngôn ngữ lập trình nói riêng
2 Mục đích của sáng kiến
Ngoài việc giúp cho học sinh tiếp cận dễ dàng với các thuật toán sắp xếp
và tìm kiếm thì sáng kiến còn xây dựng hệ thống các dạng bài tập thường gặp để
ôn luyện cho học sinh dự thi các kỳ thi học sinh giỏi môn tin học
3 Phạm vi nghiên cứu
Sáng kiến tập trung việc đổi mới trong xây dựng kế hoạch giáo dục phùhợp cũng như nghiên cứu nội dung các thuật toán tìm kiếm và sắp xếp theo
Trang 5chương trình Chuẩn ở trường THPT Bên cạnh đó cũng đề cập đến một số phần
mở rộng cũng như nâng cao của các thuật toán tìm kiếm và sắp xếp dùng trong
ôn thi học sinh giỏi Cùng với đó là hệ thống ví dụ minh họa cũng như bài tập ápdụng với từng thuật toán cụ thể
4 Phương pháp nghiên cứu
a) Nghiên cứu lý luận: Tìm hiểu về các tài liệu đề cập đến các thuật toán tìm
kiếm và sắp xếp,
b) Nghiên cứu thực tiễn: Tìm hiểu về cách giảng dạy tìm kiếm và sắp xếp mà
giáo viên thường làm Phân tích và làm rõ ưu điểm, nhược điểm của từng cáchdạy để từ đó xây dựng nội dung một cách hợp lý nhằm bồi dưỡng năng lực tựhọc cho học sinh
c) Thực nghiệm sư phạm: Tiến hành thực nghiệm nhằm đánh giá tính khả thi, tính
hiệu quả và tính phổ dụng của sáng kiến Đồng thời, cũng nhằm hoàn thiện vềmặt nội dung và lý luận trong sáng kiến
Trang 6PHẦN II - GIẢI QUYẾT VẤN ĐỀ
I Cơ sở lý luận:
Thuật toán sắp xếp và tìm kiếm là hai khái niệm căn bản trong bộ môn tin
học nói chung và trong chuyên ngành lập trình nói riêng Ngay cả trong cuộc
sống hàng ngày ta vẫn thường gặp những công việc liên quan đến sắp xếp, tìmkiếm như xếp hàng tập trung cho học sinh theo thứ tự từ thấp đến cao, xếp điểmtrung bình các môn học cuối năm của một lớp theo thứ tự từ cao đến thấp; tìmnhững học sinh có học lực loại yếu, những học sinh phải thi lại… Nói một cáchtổng quát, cho một dãy đối tượng, cần sắp xếp lại vị trí các đối tượng hoặc tìmkiếm các đối tượng theo một tiêu chí nào đó
Dưới đây ta xét bài toán sắp xếp, tìm kiếm dạng đơn giản và hướng giảiquyết thông thường như sau:
Bài toán 1: Cho dãy A gồm N số nguyên a1, a2,… aN Sắp xếp các số hạng đểdãy A trở thành dãy không giảm (tức là số hạng trước không lớn hơn số hạngsau)
- Xác định bài toán
+ Input: Dãy A gồm N số nguyên a1, a2,… aN
+ Output: Dãy A được sắp xếp lại thành dãy không giảm
- Ý tưởng: Với mỗi cặp số hạng liền kề trong dãy, nếu số trước lớn hơn số sau ta
đổi vị trí của chúng cho nhau Việc này được lặp lại cho đến khi không còn sự đổi chỗ nào xảy ra nữa
Bài toán 2: Cho dãy A gồm N số nguyên khác nhau: a1, a2,…, aN và một sốnguyên K Tìm xem có hay không chỉ số i (1 i N ) mà ai = K Nếu có hãycho biết chỉ số só đó
- Xác định bài toán:
+ Input: Dãy A gồm N số nguyên a1, a2,…, aN và số nguyên K
+ Output: Đưa ra chỉ số i sao cho ai=K (nếu có)
- Ý tưởng: Lần lượt từ số hạng thứ nhất so sánh giá trị số hạng với K cho đến
khi tìm được hoặc tìm hết mà không tìm được số hạng nào có giá trị bằng K
Đây là hai bài toán cơ bản mà học sinh có thể sử dụng những kiến thức
đã học trong sách giáo khoa để thực hiện.
II Cơ sở thực tiễn
Ưu điểm của việc sử dụng các thuật toán trong sách giáo khoa đó là dễnhớ, dễ sử dụng Tuy nhiên nhược điểm của các thuật toán này là không áp dụngcho nhiều bài toán khác nhau, thời gian thực hiện không tối ưu với các loại dữliệu lớn, bên cạnh đó thì không kích thích được tư duy học sinh, dễ làm học sinhtiếp thu một các thụ động, gây ra sự nhàm chán khi học, khó phát triển tư duythuật toán của học sinh mà đây là một trong nội dung hết sức quan trọng vớiviệc học lập trình Bên cạnh đó thì có quá ít bài tập về sắp xếp, tìm kiếm để học
Trang 7sinh vận dụng dẫn đến học sinh hiểu về toán tìm kiếm và sắp xếp một cách rất
mơ hồ, không biết sử dụng một cách linh hoạt cho các bài toán khác nhau Mặtkhác tôi nhận thấy giữa thuật toán được học ở lớp 10 và ngôn ngữ lập trình lớp
11 chưa có sự gắn kết chặt chẽ Các em được học về thuật toán nhưng sau gầnmột năm các em mới có thể vận dụng thuật toán đó sang một ngôn ngữ lập trình
cụ thể Điều đó dẫn tới việc các em quên, không nắm chắc được thuật toán, làmcho thuật toán vốn dĩ đã khó càng trở nên khó hơn nữa Hậu quả là việc học môntin ở trường THPT đối với các em là đối phó không mang lại sự hấp dẫn mới mẻđối với một môn học mà nó là nền tảng của các công việc ngày nay
III Các biện pháp để giải quyết vấn đề
1 Xây dựng kế hoạch giảng dạy:
Để học sinh có thể vận dụng các thuật toán trực tiếp vào thực tiễn thì mỗinhà trường cần thay đổi nội dung chương trình phù hợp quá trình học tập củahọc sinh Cụ thể với bộ môn tin học của trường THPT Gia Viễn B chúng tôi đãthống nhất xây dựng nội dung chương trình tin học đó là đưa nội dung của phầnthuật toán, trong đó có thuật toán sắp xếp và tìm kiếm vào nội dung của chươngtrình tin học lớp 11 như sau:
Tuầ
Chương I Một số khái niệm lập trình và ngôn
ngữ lập trình
§1 Khái niệm trước pháp luật.m lật và hoàn toàn chịu trách nhiệm trước pháp luật.p trình và trung thực, ngôn ngữ lật và hoàn toàn chịu trách nhiệm trước pháp luật.p
trình
2 trình§2 Các thà trung thực,nh phần của ngôn ngữ lật và hoàn toàn chịu trách nhiệm trước pháp luật.p
2 3 §4 Bà trung thực,i toán và trung thực, thuật và hoàn toàn chịu trách nhiệm trước pháp luật.t toán (tiết 1)
Sách GK 10
4 §4 Bà trung thực,i toán và trung thực, thuật và hoàn toàn chịu trách nhiệm trước pháp luật.t toán (tiết 2)
3 56 §4 Bà trung thực,i toán và trung thực, thuật và hoàn toàn chịu trách nhiệm trước pháp luật.t toán (tiết 3) §4 Bà trung thực,i toán và trung thực, thuật và hoàn toàn chịu trách nhiệm trước pháp luật.t toán (tiết 4)
Chương II Chương trình đơn giản
§3 Cấu trúc chươn là trung thực,ng trình
§4 Một số kiểu dữ liệm trước pháp luật.u chuẩn
§5 Khai báo biến
5
10 §8 Soạn thảo, dịu trách nhiệm trước pháp luật.ch, thực,c hiệm trước pháp luật.n và trung thực, hiệm trước pháp luật.u §7 Các thủ tục chuẩn và trung thực,o/ra đoan mọi thông tin nêu trong đơn là trung thực,ơn là trung thực,n giản
chỉnh chươn là trung thực,ng trình.
6 11 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 1 ( mục a, b, c)
Phòng máy
12 i)Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 1 ( mục d, e, f, g, h, Phòng máy
Trang 8Chương III Cấu trúc rẽ nhánh và lặp
10 19 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p
20 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 2 ( mục a, b, c, d) Phòng máy
11 21 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 2 ( mục e, f, g, h)
Phòng máy
22 Ôn tật và hoàn toàn chịu trách nhiệm trước pháp luật.p
Chương IV Kiểu dữ liệu có cấu trúc
14 27 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p
28 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 3 ( bà trung thực,i 1) Phòng máy
15 29 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 3 ( bà trung thực,i 2)
Phòng máy
30 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 4 ( bà trung thực,i 1) Phòng máy
16 31 Bà trung thực,i tật và hoàn toàn chịu trách nhiệm trước pháp luật.p và trung thực, thực,c hà trung thực,nh 4 ( bà trung thực,i 2)
Phòng máy
32 Ôn tật và hoàn toàn chịu trách nhiệm trước pháp luật.p
17 33 Ôn tật và hoàn toàn chịu trách nhiệm trước pháp luật.p
2 Xây dựng nội dung giảng dạy các thuật toán:
Bên cạnh việc thay đổi cấu trúc chương trình thì việc thay đổi nội dung,phương pháp giảng dạy cho phù hợp thực tiễn là một điều hết sức quan trọng.Dưới đây là nội dung mà chúng tôi thực hiện giảng dạy trong chuyên đề thuậttoán sắp xếp và tìm kiếm Bên cạnh những thực toán trong sách giáo khoa chođối tượng học sinh lớp cơ bản là những thuật toán nâng cao để ôn luyện cho họcsinh giỏi
2.1 Bài toán đặt vấn đề
Theo phương pháp dạy học tích cực để tiếp cận khái niệm sắp xếp và một
Trang 9số thuật toán sắp xếp thì nên đưa ví dụ mang tính thực tiễn hoặc đơn giản đểphát huy khả năng của hiện có của học sinh.
Ví dụ như ta có thể đưa ra bài toán sau cho học sinh thảo luận và đưa raphương án giải quyết:
Bài toán 1: Cho dãy số A gồm 5 số: 5 3 1 2 4
Với những kiến thức đã được học, chắc chắn học sinh sẽ có đưa ra cáchthức như: So sánh lần lượt các số sau đó tìm số nhỏ nhất đặt ở đầu, sau đó vớicách làm tương tự tìm số nhỏ thứ 2, Rồi cuối cùng là tìm được cả 5 vị trí
Sắp xếp dãy số trên theo thứ tự tăng dần bằng thuật toán sắp xếp đượcbiểu diễn như sau:
Lượt duyệt 1: So sánh các giá trị liền kề để đưa giá trị 1 về phía đầu dãy 5 3 1 2 4
Sau đó giáo viên có thể đưa ra vấn đề mở rộng hơn:
Bài toán 2: Cho dãy số A gồm 5000 số: a1, a2, ,a5000
Như vậy đến đây học sinh sẽ xuất hiện mâu thuẫn khó giải quyết nếu dữ liệu nhỏ thì việc sắp xếp sẽ thực hiện rất đơn giản nhưng nếu dữ liệu lớn hơn thì thời gian để thực hiện sẽ rất khó kể cả sử dụng máy tính máy tính đi chăng nữa Đến đây ta có thể đưa ra phương hướng giải quyết mâu thuẫn, đó là: lựa chọn
và sử dụng một thuật toán phù hợp để giải quyết một bài toán nào đó Từ đó học sinh cũng sẽ hiểu được kết luận: “Một bài toán thì có nhiều thuật toán để giải” Dẫn dắt đến những thuật toán mới với những cách xử lý mới.
2.2 Một số thuật toán sắp xếp cơ bản:
Là hệ thống các dạng bài toán được trình bày theo mức độ phát triển tư
Trang 10duy của học sinh Trong mỗi thuật toán thì đều có mô phỏng ví dụ và đưa rađánh giá nhận xết cho từng thuật toán.
2.2.1 Thuật toán sắp xếp nổi bọt (Bubble Sort)
- Ý tưởng của thuật toán: Với mỗi cặp số hạng đứng liền kề trong dãy, nếu số
trước lớn hơn số sau ta đổi chỗ chúng cho nhau Việc đó được lặp đi lặp lại, chođến khi không có sự đổi chỗ nào xảy ra nữa
- Ý tưởng được mô tả cụ thể như sau:
+ Lượt 1: Ta xét từ cuối dãy, nếu gặp hai phần tử kề nhau mà số đứng trước lớnhơn số đứng sau thì ta đổi chỗ chúng cho nhau Sau lượt 1, phần tử nhỏ nhấtđược đưa về vị trí 1
+ Lượt 2: Ta xét từ cuối dãy (chỉ đến phần tử thứ 2), nếu gặp hai phần tử kềnhau mà số đứng trước lớn hơn số đứng sau thì ta đổi chỗ chúng cho nhau Saulượt 2, phần tử nhỏ thứ hai được đưa về vị trí 2
+ Lượt i: Ta xét từ cuối dãy (chỉ đến phần tử thứ i), nếu gặp hai phần tử kề nhau
mà số đứng trước lớn hơn số đứng sau thì ta đổi chỗ chúng cho nhau Sau lượt i,phần tử nhỏ thứ i được đưa về vị trí i
+ Xong lượt thứ n-1 thì dãy được sắp xếp xong
Trang 11If a[j – 1] > a[j] thenBegin
Procedure Bubble Sort;
Var i, j: integer;
tg: integer;
Begin
For i:= 1 to n – 1 do For j:= i+1 to n do
If a[j – 1] > a[j] thenBegin
Độ phức tạp của thuật toán là O(n 2 )
2.2.2 Thuật toán sắp xếp kiểu chọn (Selection Sort)
- Ý tưởng thuật toán:
+ Ở lượt thứ nhất, chọn trong dãy khóa a1, a2,…, aN ra khóa nhỏ nhất (khóa mọi khóa khác) và đổi giá trị của nó với a1, khi đó giá trị khóa a1 trở thành giá trịkhóa nhỏ nhất
+ Ở lượt thứ hai, chọn trong dãy khóa a2,…, aN ra khóa nhỏ nhất và đổi giá trịcủa nó với a2
Trang 12jmin := i;
For j := i + 1 to n
If a[j] < a[jmin] then jmin:= j;
If jmin <> i thenBegin
Trang 13(n-1) + (n-2) + …+ 1 = n( n2 1)
Độ phức tạp của thuật toán là O(N2 )
2.2.3 Thuật toán sắp xếp kiểu chèn (Insertion Sort)
- Ý tưởng thuật toán:
Xét dãy khóa a1, a2,…, aN
Ta thấy dãy con chỉ gồm mỗi một khóa a1 có thể coi là đã sắp xếp rồi.Xét thêm a2, so sánh a2 với a1, nếu thấy a2 < a1 thì chèn nó vào trước a1 Đối với a3, xét dãy gồm 2 khóa a1, a2 đã sắp xếp và tìm cách chèn a3 vào dãy khóa đó để được một thứ tự sắp xếp
Tổng quát, sắp xếp dãy a1, a2,…, ai trong điều kiện dãy ai-1 đã được sắp xếp rồi bằng cách chèn ai vào đúng vị trí dãy đó khi sắp xếp
Trang 14Nhận xét:
Trường hợp tốt nhất : Dãy ban đầu đã có thứ tự không cần phải vào vòng lặp
while Với i chạy từ 2 đến n thì số phép so sánh tổng cộng sẽ là n-1
2.2.4 Thuật toán sắp xếp nhanh (Quick Sort).
- Ý tưởng thuật toán:
Sắp xếp dãy khóa a1, a2,…, aN Có thể coi là sắp xếp đoạn chỉ số từ chỉ số
1 tới chỉ số n trong dãy khóa đó Để sắp xếp một đoạn trong dãy khóa, nếu đoạn
đó 1 phần tử thì không cần phải làm gì
Nếu đoạn đó có 2 phần tử trở lên thì ta chọn một khóa ngẫu nhiên làmchốt, mọi khóa nhỏ hơn chốt thì được xếp vào vị trí trước chốt, còn mọi khóalớn hơn chốt thì được xếp vào vị trí 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ạnkhác rỗng mà mọi khóa trong đoạn đầu chốt, và mọi khóa trong đoạn sau đều
Trang 15while a[i] < x do inc (i);
while a[j] > x do dec (j);
Trường hợp chương trình ít gọi tới thủ tục sắp xếp và chỉ sắp xếp trên tập
dữ liệu nhỏ thì có thể sử dụng thuật toán đơn giản có độ phức tạp O(N2) dễ càiđặt
Trường hợp sắp xếp trên tập dữ liệu lớn nên sử dụng thuật toán sắp xếpnhanh vì độ phức tạp của thuật toán là O(nlogn)
2.2.5 Sắp xếp bằng đếm phân phối (Distribution Counting)
- Ý tưởng thuật toán
Thuật toán dành cho trường hợp đặc biệt, khóa của các phần tử A1, A2,…,
AN là các số nguyên nằm trong khoảng từ 0 tới K (Tkey = 0 M)
Xây dựng dãy C0, C1,…CM các biến đếm, trong đó CV là số lần xuất hiệngiá trị V trong dãy khóa
Dựa vào dãy biến đếm, ta sẽ biết được sau khi sắp xếp thì giá trị V nằm từ
vị trí nào tới vị trí nào Tức là sau khi sắp xếp:
+ Giá trị 0 đứng trong đoạn từ vị trí 1 tới vị trí C0
+ Giá trị 1 đứng trong đoạn từ vị trí C0+1 tới vị trí C0+C1
+ Giá trị 2 đứng trong đoạn từ vị trí C0+C1+1 tới vị trí C0+C1+C2
Trang 16đó duyệt lại dãy khóa A, mỗi khi gặp khóa mang giá trị V ta đưa giá trị đó vàokhóa Xcv và giảm Cv đi 1 Và cuối cùng là gán giá trị dãy khóa X cho dãy khóaA.
Độ phức tạp của thuật toán là O(max(N, M)) Giá trị M càng nhỏ thì thuật
toán sắp xếp càng nhanh Nhưng cần lưu ý là Distribution Counting Sort chỉ nên
áp dụng khi ta biết rõ M, nếu M quá lớn mà N nhỏ thì nên lựa chọn các thuậttoán khác để xử lý
2.2.6 Thuật toán sắp xếp trộn (Merge Sort).
- Ý tưởng:
- Nếu chỉ có một phần tử trong dãy thì coi như dãy đã được sắp xếp Ngược lại
Trang 17thì chia dãy thành hai nửa cho tới khi không thể chia được nữa; sau đó kết hợpcác dãy nhỏ lại thành dãy mới đã được sắp xếp.
m:=(r+1) div 2; mergesort(1,m); mergesort(m+1,r);
for i := m downto 1 do b[i] := a[j];
for j :=m+1 to r do b[r+m+1-j] := a[j];
for k :=1 to r do
if b[i] < b[j] then
begin a[k] := b[i] ; i := i+1 end
else begin a[k] := b[j]; j:= j-1 end;
O(nlog 2 n)
2.3 Một số thuật toán tìm kiếm cơ bản.
Trang 18Trong ngành khoa học máy tính, một giải thuật tìm kiếm là một thuật toánlấy đầu vào là một bài toán và trả về kết quả là một lời giải cho bài toán đó,thường là sau khi cân nhắc giữa một loạt các lời giải có thể Hầu hết các thuậttoán được nghiên cứu bởi các nhà khoa học máy tính để giải quyết các bài toánđều là các thuật toán tìm kiếm Dưới đây là bài toán dạng đơn giản để chúng ta
có thể hiểu rõ hơn về các thuật toán tìm kiếm
- Bài toán: Cho dãy A gồm N số nguyên khác nhau: a1, a2,…, aN và một sốnguyên K Cần biết có hay không chỉ số i (1 i N ) mà ai = k Nếu có hãycho biết chỉ số só đó
- Xác định bài toán:
- Input: Dãy A gồm N số nguyên a1, a2,…, aN và số nguyên K
- Output: Đưa ra chỉ số i sao cho ai=k (nếu có)
2.3.1 Thuật toán tìm kiếm tuần tự (Sequential Search)
- Ý tưởng thuật toán:
Tìm kiếm tuần tự được thực hiện một cách tự nhiên Lần lượt từ số hạngthứ nhất, ta so sánh giá trị số hạng đang xét với khoá cho đến khi hoặc gặp một
số hạng bằng khoá hoặc dãy đã được xét hết và không có giá trị nào bằng khoá.Trong trường hợp thứ hai dãy A không có số hạng nào bằng khoá
- Ví dụ: Cho dãy s A g m các ph n t : 4 5 6 9 2 1 v s k=9, thu t toán tìmố ồm các phần tử: 4 5 6 9 2 1 và số k=9, thuật toán tìm ầ ử: 4 5 6 9 2 1 và số k=9, thuật toán tìm à trung thực, ố ật và hoàn toàn chịu trách nhiệm trước pháp luật
ki m tu n t mô t b ng b ng sau:ế ầ ực, ả ằng bảng sau: ả
Thuật toán tìm kiếm tuần tự sẽ duyệt tuần tự từ phần đầu đến khi tìm thấyphần tử có giá trị bằng k thì dừng lại, như ví dụ trên ta sẽ tìm được i=5
If a[i] = k then
breakelse i:=i+1;
Trang 19Độ phức tạp thuật toán: O(n)
2.3.2 Thuật toán tìm kiếm nhị phân (Binary Search)
- Ý tưởng:
Sử dụng tính chất dãy A là dãy tăng, ta tìm cách thu hẹp nhanh phạm vitìm kiếm sau mỗi lần so sánh khoá với số hạng được chọn Để làm điều đó, tachọn số hạng aGiua ở “giữa dãy” để so sánh với k, trong đó Giua = (Chỉ sốđầu+chỉ số cuối)/2 (Dãy đang xét)
Khi đó, chỉ xảy ra một trong ba trường hợp sau:
– Nếu aGiua = k thì Giua là chỉ số cần tìm Việc tìm kiếm kết thúc
– Nếu aGiua > k thì do dãy A là dãy đã được sắp xếp nên việc tìm kiếm tiếptheo chỉ xét trên dãy a1, a2,…, aGiua–1 (phạm vi tìm kiếm mới bằng khoảngmột nửa phạm vi tìm kiếm trước đó)
– Nếu aGiua < k thì thực hiện tìm kiếm trên dãy aGiua+1, aGiua+2,…, aN
Quá trình trên sẽ được lặp lại một số lần cho đến khi hoặc đã tìm thấykhoá k trong dãy A hoặc phạm vi tìm kiếm bằng rỗng
- Ví dụ: Cho dãy A gồm các phần tử 2 3 6 7 8 9 và một số nguyên x=7, thuật
toán tìm kiếm nhị phân được thể hiện qua bảng mô tả như sau:
Như vậy với chỉ sau ba lần duyệt thì thuật toán đã tìm ra chỉ số phần tử có giá trịbằng x là i=4;
Trang 20else dau:= giua+1;
Độ phức tạp thuật toán: O(log(n))
Thuật toán này thực hiện dựa trên giả thiết là dữ liệu đã được sắp xếp Nếucần sắp xếp trước khi tìm kiếm thì độ phức tạp sẽ tăng lên vì vậy nên áp dụngthuật toán trong tình huống dãy đã sắp xếp sẵn
2.4 Một số ví dụ
Ví dụ 1: Cho mảng số nguyên gồm N phần tử đôi một khác nhau: a1, a2, …, aN
và số nguyên dương K (1K N ) Hãy đưa ra giá trị nhỏ thứ k trong dãy
Vận dụng thuật toán sắp xếp nổi bọt, ý tưởng là đưa các giá trị nhỏ nhất
về phía đầu dãy sau các lần duyệt, như vậy chỉ cần đến lần duyệt thứ K chúng ta
If a[j - 1] > a[j] thenBegin
Trang 21Với dữ liệu lớn (N>5000) ta có thể vận dụng thuật toán sắp xếp nhanh: + Nếu K < LH thì không cần sắp xếp đoạn từ L đến H vì không ảnh hưởng đến vị trí thứ K.
+ Nếu LH < K thì cũng không cần sắp xếp đoạn từ L đến H vì không ảnh hưởng đến vị trí thứ K
+ Nếu LK H thì ta sẽ thực hiện việc sắp xếp.
while a[i] < x do inc (i);
while a[j] > x do dec (j);
Trang 22* Nhận xét: Qua ví dụ trên chúng ta thấy thuật toán sắp xếp không đơn thuần
chỉ dùng để sắp xếp mà còn dùng để giải quyết các bài toán khác nữa Việc quantrọng là chúng ta phải hiểu được ý tưởng thuật toán và dựa vào ý tưởng đó vậndụng vào từng bài toán cụ thể
Ví dụ 2: Cho mảng số nguyên gồm N phần tử dương: a1, a2, …, aN (ai<=100).Hãy đưa ra số lần xuất hiện của các giá trị khác nhau có trong mảng
Ví dụ: A: 1 2 1 1 2
So 1 xuat hien 3 lan
So 2 xuat hien 2 lan
* Xác định bài toán:
Input: Số nguyên dương N, các phần tử a1, a2, …, aN
Output: Tần suất xuất hiện của các giá trị trong mảng một chiều
* Ý tưởng:
Nếu thực hiện theo ý hiểu đơn giản, ta chỉ cần sắp xếp mảng sau đó thựchiện đếm số lượng các phần tử giống nhau liền kề nhau sau đó thực hiện in kếtquả
Trang 23if x[i] < x[j] thenbegin
Tuy nhiên nếu như chúng ta xem xét kỹ dữ liệu vào của bài toán, chúng
ta thấy mảng A là một mảng mà giá trị phần tử có giới hạn vừa phải Theo ý tưởng của thuật toán phân phối có đoạn xử lý đếm số lần xuất hiện của V trong mảng A, đó cũng là cách thức để ta đếm số lần xuất hiện các phần tử khác nhau của mảng một chiều.
Uses crt;
const m=100;
type Tarray=array[1 100] of integer;
Trang 24* Nhận xét: Rõ ràng việc lựa chọn thuật toán phân phối trong trường hợp này sẽ
tiết kiệm thời gian và đơn giản hơn rất nhiều so với việc sử dụng thuật toán nổibọt Như vậy với mỗi bài toán ta nên lựa chọn thuật toán sắp xếp sao cho tối ưu
và phù hợp nhất
Ví dụ 3: Cho mảng số nguyên gồm N phần tử: a1, a2, …, aN Đếm số lượng phần
tử nhỏ nhì trong mảng
* Xác định bài toán:
Input: Số nguyên dương N, các phần tử a1, a2, …, aN
Output: Số lượng phần tử nhỏ nhì trong dãy
* Ý tưởng:
- Tìm phần tử nhỏ nhất của mảng
- Tìm phần tử nhỏ nhì của mảng (là phần tử lớn hơn phần tử nhỏ nhấtnhưng lại nhỏ hơn các phần tử còn lại
- Đếm số lượng các phần tử có giá trị bằng phần tử nhỏ nhì
* Chương trình:
Trang 251 Cho mảng số nguyên A gồm 10 chữ số: 6 1 5 3 7 8 10 9 12 4 Hãy mô phỏng
các thuật toán sắp xếp để sắp xếp dãy số trên thành dãy số tăng dần
2 Cho mảng A gồm có n phần tử Hãy viết chương trình để sắp xếp mảng A
theo thứ tự giảm dần
3 Viết chương trình nhập vào mảng số nguyên gồm N phần tử khác nhau Tìm
và đưa ra màn hình giá trị lớn nhất của mảng
4 Viết chương trình nhập vào mảng 2 chiều có m hàng, n cột Hãy thực hiện các
yêu cầu sau:
a Sắp xếp các hàng theo thứ tự tăng dần
b Sắp xếp các cột theo thứ tự giảm dần
c Sắp xếp các hàng chẵn theo thứ tự tăng dần, các hàng lẻ theo thứ tự giảm dần
d Sắp xếp các cột chẵn theo thứ tự giảm dần, các cột lẻ theo thứ tự tăng dần
5 Viết chương trình nhập vào 2 mảng bất kỳ mảng A gồm có n phần tử, mảng B
Trang 26Hãy sắp xếp các phân số trong tập F(N) theo thứ tự tăng dần.
TL 10.1.9 Cho một dãy N viên gạch lần lượt có độ cách nhiệt là các số a1 aN.Nếu xếp lần lượt các viên gạch theo trình tự đó thì độ cách nhiệt cả khối là a1 +
a2 + + aN + max(0, a2 - a1) + max(0, a3 - a2) + + max(0, aN - aN - 1) Nhiệm vụcủa bạn là tìm cách xếp sao cho độ cách nhiệt của cả khối là lớn nhất có thể
Dữ liệu vào:
Dòng đầu ghi số nguyên dương N (0 < n ≤ 105)
N dòng sau mỗi dòng ghi một số ai ( 1 ≤ i ≤ N và 1 ≤ ai ≤ 10000)
Dữ liệu ra: Ghi trên một dòng kết quả cần tìm
Ví d : ụ
45417
24
10 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 Các đoạn dây xích này tách rời nhau Mỗi đoạn mắtxích có không quá 20000 mắt xích Bằng cách cắt ra một mắt xích, sau đó hànlại, ta có thể nối hai dây xích thành một đoạn Thời gian để cắt và hàn mỗi mắtxích là 1 đơn vị thời gian và được xem là bằng nhau với mọi mắt xích Nhiêm
vụ của bạn là phải nối chúng lại thành một đoạn dây xích duy nhất với thời gian
ít nhất (hay số mắt xích bị cắt và hàn lại là ít nhất)
Dữ liệu vào:
Dữ liệu vào cho trong file văn bản có cấu trúc như sau: Dòng đầu tiên là số N,
số đoạn xích Những dòng tiếp theo ghi N số nguyên dương, số thứ i là số mắtxích có trong đoạn xích thứ i (i <= i <= N) Hai số cạnh nhau trên cùng một dòngcách nhau ít nhất một dấu cách
Dữ liệu ra:
Một dòng duy nhất là số đơn vị thời gian mà bạn cần để nối N đoạn xích đã cho
Ví d :ụ
Trang 272 34
2
11 Trên trục số thực cho n điểm đen và n điểm trắng hoàn toàn phân biệt Các
điểm đen có tọa độ nguyên a1, a2, …, an còn các điểm trắng có tọa độ nguyên b1,
b2, …, bn Người ta muốn chọn ra k điểm đen và k điểm trắng để nối mỗi mộtđiểm đen với một điểm trắng sao cho k đoạn thẳng tạo được đôi một không cóđiểm chung
Yêu cầu: Cho tọa độ của n điểm đen a1, a2, …, an và tọa độ của điểm trắng b1, b2,
…, bn Hãy tìm giá trị k lớn nhất thỏa mãn yêu cầu trên
Dữ liệu:
Dòng thứ nhất chứa số nguyên dương n (n <= 105)
Dòng thứ hai chứa các số a1, a2, …, an (|ai| <= 109, i = 1, 2,…, n)
Dòng thứ ba chứa các số b1, b2, …, bn (|bi| <= 109, i = 1, 2,…, n)
Các số trên cùng một dòng được ghi cách nhau ít nhất một dấu cách
Kết quả: Ghi ra một số nguyên duy nhất là số k lớn nhất tìm được
Ví d :ụ
3
0 3 1-3 5 -1
2
12 Hai bạn học sinh trong lúc nhàn rỗi nghĩ ra trò chơi sau đây Mỗi bạn chọn
trước một dãy số gồm n số nguyên Giả sử dãy số mà bạn thứ nhất chọn là: b1,
b2, , bn; còn dãy số mà bạn thứ hai chọn là: c1, c2, , cn
Mỗi lượt chơi mỗi bạn đưa ra một số hạng trong dãy số của mình Nếu bạn thứnhất đưa ra số hạng bi (1 ≤ i ≤ n), còn bạn thứ hai đưa ra số hạng cj (1 ≤ j ≤ n) thìgiá của lượt chơi đó sẽ là |bi+cj|
Ví dụ: Giả sử dãy số bạn thứ nhất chọn là 1, -2; còn dãy số mà bạn thứ hai chọn
là 2, 3 Khi đó các khả năng có thể của một lượt chơi là (1, 2), (1, 3), (-2, 2), (-2,3) Như vậy, giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể là 0tương ứng với giá của lượt chơi (-2, 2)
Yêu cầu: Hãy xác định giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể
- Dữ liệu:
Dòng đầu tiên chứa số nguyên dương n (n ≤ 105)
Dòng thứ hai chứa dãy số nguyên b1, b2, , bn (|bi| ≤ 109, i=1, 2, , n)
Dòng thứ hai chứa dãy số nguyên c1, c2, , cn (|ci| ≤ 109, i=1, 2, , n)
Hai số liên tiếp trên một dòng được ghi cách nhau bởi dấu cách
- Kết quả:
Ghi ra giá nhỏ nhất tìm được
Trang 281 Tư tưởng của thuật toán sắp xếp nổi bọt là:
A Tìm và đổi chỗ các phần tử kề nhau sai thứ tự (phần tử đứng trước lớnhơn phần tử đứng sau) cho đến khi không tồn tại cặp nào sai thứ tự
B Tìm và đổi chỗ các phần tử đứng cách nhau một phần tử (phần tử đứngtrước lớn hơn phần tử đứng sau) cho đến khi không tồn tại cặp nào sai thứtự
C Tìm và đổi chỗ một cặp phần tử kề nhau
D Tìm và so sánh các cặp phần tử đứng kề nhau
2 Áp dụng thuật toán sắp xếp nổi bọt xét từ đầu dãy về cuối dãy để được dãy
tăng dần, hãy cho biết sau lượt duyệt 1, phần tử nào được đưa về cuối dãy?
A Nhỏ nhất B Lớn nhất C Nhỏ thứ 2 D Lớn thứ 2
3 Cho dãy A gồm N phần tử, áp dụng thuật toán sắp xếp nổi bọt cho biết:
Số lần duyệt của thuật toán là bao nhiêu để dãy được sắp xếp là dãy giảm dần?
A N – 1 B N C N +1 D N +2
4 Cho dãy A gồm các phần tử sau: 23, 12, 34, 6, -5, 27
Sau lượt duyệt thứ 1 với thuật toán sắp xếp nổi bọt để có dãy tăng dần thì
ta được dãy như thế nào?
C 12 23 6 -5 27 34
5 Thủ tục mô tả sắp xếp nổi bọt trên mảng A có N phần tử :
Procedure Bubble Sort;
Var i, j: integer;
tg: integer;
Begin
For i:= 1 to n – 1 do ( ………)
If a[j – 1] > a[j] thenBegin
Tg:= a[j];
a[j]:= a[j-1];
a[j-1]:= tg;
Trang 296 Cho dãy A gồm các phần tử: 27, 40, -7, 5, 57 Sau lượt duyệt thứ 2 với thuật
toán sắp xếp nổi bọt xét từ đầu dãy về cuối dãy để có dãy giảm dần thì ta đượcdãy như thế nào?
A 40 27 5 57 -7
B 40 27 57 5 -7
C 40 57 27 5 -7
D 57 40 27 5 -7
7 Cho dãy A gồm các phần tử: 27, 40, -7, 5, 57 Sau lượt duyệt thứ 4 với thuật
toán sắp xếp nổi bọt xét từ đầu dãy về cuối dãy để có dãy giảm dần thì ta đượcdãy như thế nào?
A 40 27 5 57 -7
B 40 27 57 5 -7
C 40 57 27 5 -7
D 57 40 27 5 -7
8 Thủ tục mô tả thuật toán sắp xếp chọn trực tiếp:
Procedure Selection Sort;
Var i, j, jmin, tg: integer;
Begin
For i:= 1 to n-1 doBegin
jmin := i;
For j := i + 1 to n
If a[j] < a[jmin] then jmin:= j;
If jmin <> i thenBegin
(……….)end;
Trang 3013 Tư tưởng thuật toán sắp xếp kiểu chèn là:
A sắp xếp dãy a1, a2,…, ai trong điều kiện dãy ai-1 đã được sắp xếp rồi bằngcách chèn ai vào đúng vị trí dãy đó khi sắp xếp
B sắp xếp dãy a1, a2,…, ai trong điều kiện dãy ai-1 chưa được sắp xếp rồibằng cách chèn ai vào đúng vị trí dãy đó khi sắp xếp
Trang 31C sắp xếp dãy a1, a2,…, ai trong điều kiện dãy ai+1 đã được sắp xếp rồi bằngcách chèn ai vào đúng vị trí dãy đó khi sắp xếp.
D sắp xếp dãy a1, a2,…, ai trong điều kiện dãy ai-2 đã được sắp xếp rồi bằngcách chèn ai vào đúng vị trí dãy đó khi sắp xếp
14 Thủ tục mô tả thuật toán sắp xếp kiểu chèn:
Procedure Insertion Sort;
Var i, j: integer;
tg: integer;
Begin
For i:= 2 to n doBegin
(……
…….)while ( j>0 ) and ( tg < a[j] ) dobegin
Trang 3219 Một mảng gồm có 16 phần tử, nếu sắp xếp mảng theo kiểu trộn thì mảng A
sẽ được chia nhỏ bao nhiêu lần?
A 4 B 5 C 6 D 7
20 Cho mảng A gồm các phần tử: 3 9 10 12 6 7 8 10 Nếu sắp xếp mảng theo
kiểu trộn thì sau lần ghép thứ 1 mảng A sẽ có trật tự như nào?
A 3 9 10 12 6 7 8 10
B 3 6 9 10 12 7 8 10
C 3 9 10 12 6 7 8 10
D 3 6 9 10 12 7 8 10
21 Cho mảng A gồm các phần tử: 3 9 10 12 6 7 8 10 Nếu sắp xếp mảng theo
kiểu trộn thì sau lần ghép thứ 3 mảng A sẽ có trật tự như nào?
Trang 3324 Thủ tục mô tả thuật toán sắp xếp nhanh:
Procedure QuickSort (L, H: longint);
Chọn câu lệnh thích hợp để đưa vào (… )
A a[i] < x do inc (i) B a[j] > x do dec (j)
C a[j] < x do dec (j) D a[i] > x do inc (i)
25 Cho mảng A gồm các phần tử: 5 0 4 2 6 7 9 8 11 3 Nếu sắp xếp mảng theo
thứ tự tăng dần theo phương pháp sắp xếp nhanh thì sau lần đầu tiên mảng sẽđược chia ra như nào?
A (5 0 4 2 3) ( 7 9 8 11 6)
B (3 0 2) (4 5) ( 7 9 8 11 6)
C 0 2 3 (4 5) ( 7 9 8 11 6)
D 0 (3 2) (4 5) ( 7 9 8 11 6)
26 Cho mảng A gồm các phần tử: 5 0 4 2 6 7 9 8 11 3 Nếu sắp xếp mảng theo
thứ tự tăng dần theo phương pháp sắp xếp nhanh thì sau lần thứ 2 mảng sẽ đượcchia ra như nào?
A 0 (3 2) (4 5) ( 7 9 8 11 6)
B (3 0 2) (4 5) ( 7 9 8 11 6)
C 0 2 3 (4 5) ( 7 9 8 11 6)
D 0 2 3 4 5 ( 7 9 8 11 6)
Trang 3427 Cho mảng A gồm các phần tử: 5 0 4 2 6 7 9 8 11 3 Nếu sắp xếp mảng theo
thứ tự tăng dần theo phương pháp sắp xếp nhanh thì sau lần thứ 3 mảng sẽ đượcchia ra như nào?
A (3 0 2) (4 5) ( 7 9 8 11 6)
B 0 2 3 (4 5) ( 7 9 8 11 6)
C 0 2 3 4 5 ( 7 9 8 11 6)
D 0 (3 2) (4 5) ( 7 9 8 11 6)
28 Cho mảng A gồm các phần tử: 5 0 4 2 6 7 9 8 11 3 Nếu sắp xếp mảng theo
thứ tự tăng dần theo phương pháp sắp xếp nhanh thì sau lần thứ 4 mảng sẽ đượcchia ra như nào?
A 3 0 2 (4 5) ( 7 9 8 11 6)
B 0 2 3 (4 5) ( 7 9 8 11 6)
C 0 (2 3) 4 5 ( 7 9 8 11 6)
D 0 (3 2) (4 5) ( 7 9 8 11 6)
29 Cho mảng A gồm các phần tử: 5 0 4 2 6 7 9 8 11 3 Nếu sắp xếp mảng theo
thứ tự tăng dần theo phương pháp sắp xếp nhanh thì sau lần thứ 5 mảng sẽ đượcchia ra như nào?
A (3 0 2) (4 5) ( 7 9 8 11 6)
B 0 3 (2 4 5) ( 7 9 8 11 6)
C 0 2 3 4 5 ( 7 9 8 11 6)
D 2 (3 0) (4 5) ( 7 9 8 11 6)
30 Cho mảng A gồm các phần tử: 5 0 4 2 6 7 9 8 11 3 Nếu sắp xếp mảng theo
thứ tự tăng dần theo phương pháp sắp xếp nhanh thì sau lần thứ 6 mảng sẽ đượcchia ra như nào?
3 Cho một mảng gồm có N phần tử đã được sắp xếp theo chiều tăng dần Tìm
và đưa ra số bé nhất lớn hơn hoặc bằng x (chỉ số bé nhất)
4 Cho một mảng gồm có N phần tử đã được sắp xếp theo chiều tăng dần Tìm
Trang 35và đưa ra số lớn nhất lớn hơn hoặc bằng x (chỉ số lớn nhất).
5 Cho một mảng gồm có N phần tử đã được sắp xếp theo chiều tăng dần Tìm
và đưa ra dãy con tăng dài nhất
6 SẮP XẾP CÔNG VIỆC
Có n người, n việc (1 < n ≤ 200) Người thứ i thực hiện công việc mất C[i,j] đơn
vị thời gian Giả sử tất cả bắt đầu vào thời điểm 0, hãy tìm cách bố trí mỗi côngviệc cho mỗi người sao cho thời điểm hoàn thành công việc là sớm nhất có thể
Trong khu vườn, người ta trồng một hàng cây chạy dài gồm có N cây, mỗi cây
có độ cao là a1, a2,…aN Người ta cần lấy M mét gỗ bằng cách đặt cưa máy saocho lưỡi cưa ở độ cao H (mét) để cưa tất cả các cây có độ cao lớn hơn H (dĩnhiên những cây có độ cao không lớn hơn H thì không bị cưa)
Ví dụ: Nếu hàng cây có các cây với độ cao tương ứng là 20; 15; 10 và 18 mét,cần lấy 7 mét gỗ Lưỡi cưa đặt tại độ cao hợp lí là 15 mét thì độ cao của các câycòn lại sau khi bị cưa tương ứng là 15; 15; 10 và 15 mét Tổng số mét gỗ lấyđược là 8 mét (dư 1 mét)
Yêu cầu: Hãy tìm vị trí đặt lưỡi cưa hợp lí (số nguyên H lớn nhất) sao cholấy được M mét gỗ và số mét gỗ dư ra là ít nhất
Dữ liệu: Vào từ tệp văn bản WOOD.INP
- Dòng thứ nhất chứa 2 số nguyên dương N và M (1≤N≤106 ;1≤M≤2x109 ) cách nhau một dấu cách
- Dòng thứ hai chứa N số nguyên dương ai là độ cao của mỗi cây tronghàng (1≤ai≤109 ; i=1…N), mỗi số cách nhau ít nhất một dấu cách.Kết quả: Đưa ra tệp WOOD.OUT là một số nguyên cho biết giá trị cầntìm
Ví dụ:
Trang 36If a[i] = k then
breakelse i:=i+1;
2 Cho dãy A gồm các phần tử sau: 6, 8, 13, -6, 33, 46 và k=8 Áp dụng thuật
toán tìm kiếm tuần tự thì giá trị i nhận là bao nhiêu thì thuật toán dừng?
A 2 B 3 C 4 D 5
3 Cho dãy A gồm các phần tử sau: 5, 7, 12, -5, 34, 47 và k=34 Áp dụng thuật
toán tìm kiếm tuần tự thì giá trị i nhận là bao nhiêu thì thuật toán dừng?
A 2 B 3 C 4 D 5
4 Thuật toán tìm kiếm tuần tự dừng lại khi nào?
A Khi xét hết dãy mà không có phần tử nào bằng khóa
B Khi có phần tử trong dãy bằng khóa
C A và B
D Thuật toán chỉ xét phần tử đầu tiên rồi dừng lại
5 Cho dãy A gồm các phần tử sau: 4, 4, 12, -5, 32, 4 và k=4 Áp dụng thuật toán
tìm kiếm tuần tự đếm số lượng phần tử có giá trị bằng k trong dãy, giá trị i nhận
là bao nhiêu thì thuật toán dừng?
Trang 37else if x < a[giua] then (…….)
else dau:= giua+1;
end;
if dau > cuoi then writeln(x, ’khong có trong day’);
End;
Chọn câu lệnh thích hợp để đưa vào (… )
A dau:= giua+1 B cuoi:= giua -1 C giua:= (dau+cuoi) div 2
9 Cho dãy A gồm các phần tử sau: 12, 24, 27, 30, 33, 36 và k = 24
Áp dụng thuật toán tìm kiếm nhị phân tại lần duyệt 1 chỉ số giua nhận giá trị là
bao nhiêu?
A 1 B 2 C 3 D 4
10 Cho dãy A gồm các phần tử sau: 12, 24, 27, 30, 33, 36 và k = 24
Áp dụng thuật toán tìm kiếm nhị phân với dãy số trên, số lần duyệt là bao nhiêu?
11 Cho dãy A gồm các phần tử sau: 12, 24, 27, 30, 33, 36 và k = 44
Áp dụng thuật toán tìm kiếm nhị phân tại lần duyệt 1 chỉ số giua nhận giá trị là
bao nhiêu?
12 Cho dãy A gồm các phần tử sau: 12, 24, 27, 30, 33, 36 và k = 34
Áp dụng thuật toán tìm kiếm nhị phân với dãy số trên, số lần duyệt là bao nhiêu?
13 Cho mảng A gồm các phần tử: 11 22 25 27 30 33 35 và k = 22
Áp dụng thuật toán tìm kiếm nhị phân thì mất bao nhiêu lần so sánh để tìm đượcphần tử có giá trị bằng k?