Tải bản đầy đủ (.docx) (34 trang)

BÁO CÁO ĐỒ ÁN HỌC PHẦN 1 KÈM SOURCECODE - XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG THUẬT TOÁN SẮP XẾP NỔI BỌT, SẮP XẾP TRỘN, SẮP XẾP VUN ĐỐNG, SẮP XẾP NHANH

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 (286.71 KB, 34 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG
KHOA: CÔNG NGHỆ THÔNG TIN

NGUYỄN VĂN HƯỞNG

XÂY DỰNG CHƯƠNG TRÌNH
MÔ PHỎNG THUẬT TOÁN
SẮP XẾP NỔI BỌT,
SẮP XẾP TRỘN,
SẮP XẾP VUN ĐỐNG,
SẮP XẾP NHANH
ĐỒ ÁN HỌC PHẦN 1
CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN

HÀ NỘI, NĂM 2017


TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG
KHOA: CÔNG NGHỆ THÔNG TIN

XÂY DỰNG CHƯƠNG TRÌNH
MÔ PHỎNG THUẬT TOÁN
SẮP XẾP NỔI BỌT,
SẮP XẾP TRỘN,
SẮP XẾP VUN ĐỐNG,
SẮP XẾP NHANH
ĐỒ ÁN HỌC PHẦN 1
CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN

Giáo viên hướng dẫn
Họ tên sinh viên


Mã sinh viên
Lớp

: Ngô Thị Lan
: Nguyễn Văn Hưởng
: 1501076
: 3918CNT2

HÀ NỘI, NĂM 2017


TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT-HUNG
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN HỌC PHẦN 1
Chuyên ngành: Công nghệ thông tin
Hệ đào tạo: Cao đẳng, Đại học
Đề tài số: 57
Tên đề tài: Xây dựng chương trình mô phỏng thuật toán sắp xếp nổi bọt, sắp xếp
trộn, sắp xếp vun đống,sắp xếp nhanh.
Yêu cầu:
1. Yêu cầu về kiến thức, kỹ năng:
- Hiểu và viết được các giải thuật sắp xếp bằng phương pháp sắp xếp nổi bọt, sắp xếp
trộn, sắp xếp vun đống, sắp xếp nhanh
- Sử dụng được bộ công cụ phát triển Visual Studio 2005/2008/2010;
- Biết lập trình bằng ngôn ngữ lập trình VB.NET/C#
2. Yêu cầu về sản phẩm, chương trình:
- Chương trình viết băng ngôn ngữ VB.NET/C#;
- Xây dựng được Form cho phép nhập vào dãy số có n số nguyên (Dùng mảng);
- Sử dụng ComboBox để lựa chọn các phương pháp sắp xếp;
- Quá trình sắp xếp được hiển thị trên một ListBox (Hiện thị từng bước sắp xếp).

3. Nộp kết quả
- Báo cáo (theo mẫu của bộ môn)
- Các công cụ phát triển, chương trình, file báo cáo.
4. Các yêu cầu khác:
- Gửi lịch làm việc theo tuần cho giáo viên hướng dẫn
- Mỗi tuần phải liên hệ với giáo viên hướng dẫn ít nhất 2 lần qua email, hoặc gặp trực
tiếp
Số lượng sinh viên tham gia tối đa: 1
Thời gian thực hiện: Theo lịch của bộ môn
Tài liệu tham khảo: [1]. Giáo trình do giáo viên cung cấp
[2]. Internet
Thông qua tổ bộ môn

Người biên soạn

Ngô Thị Lan
ĐT: 0982.010.510
Email:


TRƯỜNG ĐHCN VIỆT – HUNG
KHOA:…………………….

CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do – Hạnh phúc
Mẫu DA02

NHẬN XÉT ĐỒ ÁN HỌC PHẦN 1
Chuyên ngành : ………………………………….
(Nhận xét của GV hướng dẫn

Nhận xét của GV phản biện )
Họ tên sinh viên: …………………………………………………………….………
Tên đề tài: …………………………………………………………………..……….
……………………………………………………………………………………….
Người nhận xét (Họ tên, học hàm, học vị): …………………………………………
Đơn vị công tác (Nếu có): ……………………...…………………………………..
Ý KIẾN NHẬN XÉT
1. Về nội dung & đánh giá thực hiện nhiệm vụ nghiên cứu của đề tài:
………………………………………………………………………………………………………
………………………………………………………………………………………………………
………………………………………………………………………………………………………
2. Về phương pháp nghiên cứu, độ tin cậy của các số liệu:
………………………………………………………………………………………………………
………………………………………………………………………………………………………
………………………………………………………………………………………………………
3. Về kết quả của đề tài:
………………………………………………………………………………………………………
………………………………………………………………………………………………………
………………………………………………………………………………………………………
4. Những thiếu sót và vấn đề cần làm rõ (Nếu có):
………………………………………………………………………………………………………
………………………………………………………………………………………………………
………………………………………………………………………………………………………
5. Ý kiến kết luận (Mức độ đáp ứng yêu cầu đối với đồ án học phần 1)
………………………………………………………………………………………………………
………………………………………………………………………………………………………
………………………………………………………………………………………………………
6. Câu hỏi người nhận xét dành cho học viên (Nếu có):
………………………………………………………………………………………………………
………………………………………………………………………………………………………

………………………………………………………………………………………………………
………………………………………………………………………………………………………


 Đánh giá điểm:
Kết luận:  Đồng ý /  Không đồng ý cho phép sinh viên được tham dự bảo vệ kết quả trước
hội đồng.
Ngày………tháng……..năm……..
NGƯỜI NHẬN XÉT
(chữ ký & họ tên)


LỜI NÓI ĐẦU
Hiện nay trong hầu hết cá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í dụ như : tra
cứu từ điển, tìm sách trong thư viện...) và muốn việc tìm kiếm cách nhanh chóng thì dữ
liệu cần phải được sắp xếp sẵn, ngăn nắp theo một trật tự, hệ thống nhất định sẽ cho phép
chúng ta tìm kiếm nhanh, sắp xếp có ý nghĩa rất lớn trong việc quản lí và lưu trữ.
Do đó khi xây dựng một hệ quản lý thông tin trên máy tính, bên cạnh các thuật
toán tìm kiếm, các thuật toán sắp xếp dữ liệu cũng là một trong những chủ đề được quan
tâm hàng đầu.
Hiện nay đã có nhiều giải thuật tìm kiếm và sắp xếp được xây dựng, mức độ hiệu
quả của từng giải thuật còn phụ thuộc vào tính chất của cấu trúc dữ liệu cụ thể mà nó tác
động đến mà ta lựa chọn phương pháp sắp xếp sao cho phù hợp. Trong khoa học máy tính
và trong toán học, một thuật toán sắp xếp là một thuật toán sắp xếp các phần tử của một
danh sách (hoặc một mảng theo thứ tự tăng dần hoặc giảm dần). Người ta thường xét
trường hợp các phần tử cần sắp xếp là các số. Hầu hết các bài toán đều có nhiều thuật toán
khác nhau để giải quyết chúng.
Nội dung giới thiệu trình bày dưới đây là những thuật toán sắp xếp thông dụng
nhất và đó cũng là nội dung mà em nghiên cứu trong đề tài này là:

1. Phương pháp sắp xếp nổi bọt (Bubble sort);
2. Phương pháp sắp xếp trộn (Merge sort);
3. Phương pháp sắp xếp kiểu vun đống (Heap sort);
4. Phương pháp sắp xếp nhanh (Quick sort);
Ngoài ra còn có nhiều thuật toán sắp xếp khác nữa như: Phương pháp sắp xếp cải tiến
(Shellsort), sắp xếp đếm phân phối (distribution counting).... Trong đề tài này chúng ta sẽ
được lần lượt tìm hiểu khảo sát từng thuật toán trên. Thuật toán Bubble sort là một trong
những thuật toán đơn giản dễ cài đặt nhưng chi phí cao. Các thuật toán Merge sort, Heap
sort , Quick sort phức tạp hơn nhưng hiệu suất cao hơn Bubble Sort. Các thuật toán trên
đều có một điểm chung là đều được xây dựng dựa trên cơ sở so sánh giá trị của các phần
tử trong mảng (hay so sánh các khóa tìm kiếm). Khi xây dựng một thuật toán sắp xếp cần
chú ý tìm cách giảm thiểu những phép so sánh và đổi chổ không cần thiết để tăng hiệu
quả của thuật toán.
Mặt dù em đã rất cố gắng và nổ lực để làm đề tài này do kinh nghiệm còn hạn chế
và kiến thức em nắm chưa sâu nên em biết sẽ không tránh khỏi những thiếu sót. Em rất
mong nhận được sự thông cảm và đóng góp của các Thầy, Cô để lần sau làm được tốt
hơn.
Hoàn thành đề tài này là niềm vui lớn nên em rất là biết ơn cô Ngô Thị Lan đã
hướng dẫn em tận tình trong suốt thời gian em làm bài. Một lần nữa em xin gửi lời cám
ơn chân thành nhất đến cô.
Hà Nội, ngày
tháng
năm 2017.
Sinh viên thực hiện:


Nguyễn Văn Hưởng


NHẬT KÝ THỰC HIỆN ĐỀ TÀI

Thời gian

Thực hiện

11/10
/10
/10
/10
/11
/12
11/12

Nhận đề tài
Đặt vấn đề
Gặp trực tiếp cô và làm theo hướng dẫn
Làm bài báo cáo
Xây dựng chương trình
Hoàn thành báo cáo, demo
Nộp báo cáo

Ghi chú


MỤC LỤC

LỜI NÓI ĐẦU..................................................................................................................... i
MỤC LỤC........................................................................................................................... i
MỞ ĐẦU............................................................................................................................ 1
I.


Đặt vấn đề.................................................................................................................1

II. Mục tiêu nghiên cứu của đề tài.................................................................................1
III. Nhiệm vụ của đề tài..................................................................................................1
IV. Kết quả đạt được của đề tài.......................................................................................1
V. Bố cục của đề tài.......................................................................................................2
CHƯƠNG 1 TÌM HIỂU VỀ THUẬT TOÁN VÀ SẮP XẾP..............................................3
1.1. Thuật toán (giải thuật) – Algorithm..........................................................................3
1.1.1. Định nghĩa thuật toán.........................................................................................3
1.1.2. Đặc trưng của thuật toán....................................................................................4
1.1.3. Biểu diễn thuật toán............................................................................................4
1.1.3.1 Mô tả các bước thực hiện................................................................................4
1.1.3.2 Sử dụng sơ đồ (lưu đồ) giải thuật (flowchart).................................................5
1.1.4. Độ phức tạp thuật toán - Algorithm Complexity................................................6
1.1.4.1. Các tiêu chí đánh giá thuật toán......................................................................6
1.2. Khái niệm về sắp xếp................................................................................................7
1.3. Khái niệm nghịch thế................................................................................................7
1.4. Các tiêu chuẩn đánh giá một thuật toán sắp xếp.......................................................8
CHƯƠNG 2 NỘI DUNG CỦA CÁC PHƯƠNG PHÁP SẮP XẾP....................................9
2.1.

Phương pháp sắp xếp nổi bọt (Bubble sort)..........................................................9

2.1.1.

Giải thuật........................................................................................................9

2.1.2.

Đánh giá giải thuật..........................................................................................9


2.1.3.

Ví dụ.............................................................................................................10

2.2.

Phương pháp sắp xếp trộn (Merge Sort).............................................................11

2.2.1.

Nguyên tắc sắp xếp bằng phép trộn..............................................................11

2.2.2.

Giải thuật......................................................................................................11


2.2.3.

Đánh giá giải thuật........................................................................................12

2.2.4.

Ví dụ.............................................................................................................12

2.3.

Phương pháp sắp xếp vun đống (Heap Sort)......................................................13


2.3.1.

Định nghĩa Heap...........................................................................................13

2.3.2.

Giải thuật......................................................................................................14

2.3.3.

Đánh giá giải thuật........................................................................................14

2.3.4.

Ví dụ.............................................................................................................14

2.4.

Phương pháp sắp xếp nhanh (Quick Sort)..........................................................16

2.4.1.

Giải thuật......................................................................................................16

2.4.2.

Đánh giá giải thuật........................................................................................17

2.4.3.


Ví dụ.............................................................................................................18

CHƯƠNG 3 CHƯƠNG TRÌNH DEMO..........................................................................19
3.1.

Microsoft Visual Studio 2010.............................................................................19

3.2.

Tại sao sử dụng Windows Forms.......................................................................19

3.3.

Chương trình demo............................................................................................20

3.4.

Kết luận..............................................................................................................22

3.4.1.

Kết quả đạt được...........................................................................................22

3.4.2.

Hạn chế.........................................................................................................23

TÀI LIỆU THAM KHẢO.................................................................................................24



1

MỞ ĐẦU
I. Đặt vấn đề
Quá trình sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng điển
hình như là một dãy số nào đó, một dãy chữ theo thứ tự của từ điển.v.v., nhằm sắp xếp
theo một thứ tự nhất định theo thứ tự tăng dần (hoặc giảm dần) đối với một dãy số, thứ tự
từ điển đối với một dãy chữ.v.v….
Bài toán sắp xếp thường được xuất hiện thường xuyên nhất trong các ứng dụng tin
học như trong ngôn ngữ lập trình C#,C++,Pascal...,với những yêu cầu, mục đích khác
nhau thì sắp xếp dữ liệu lưu trữ trong máy tính theo cách và các bước khác nhau….Nói
chung, dữ liệu có thể xuất hiện dưới nhiều dạng khác nhau và thường phải lưu trữ một
khối lượng dữ liệu đáng kể, nên việc xây dựng các giải thuật sắp xếp sẽ cho phép tìm
kiếm nhanh sẽ có ý nghĩa rất lớn.
II. Mục tiêu nghiên cứu của đề tài
Từ các vấn đề nêu trên giúp cho em hiểu rõ mục đích đề tài là để sắp xếp các dãy
số theo một trật tự, thứ tự tăng dần (hoặc là giảm dần) tùy theo vào yêu cầu của người
muốn sắp xếp, sắp xếp theo thự tự để giúp cho việc tìm kiếm được dễ dàng hơn, qua đó có
thể giúp hiểu rõ các ưu khuyết điểm của các phương pháp sắp xếp để so sánh tốc độ sắp
xếp, từ đó để vận dụng các phương pháp đó trong việc sắp xếp theo yêu cầu cùa bài toán
đặt ra một cách có hiệu quả.
III. Nhiệm vụ của đề tài
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 sắp xếp nổi bọt (Bubblesort) , sắp xếp trộn (Mergesort),, sắp xếp kiểu vun
đống (Heapsort), sắp xếp nhanh (Quicksort) để cài đặt chương trình Demo, cho phép sắp
xếp một dãy số đã cho tuỳ ý thành một dãy số có thứ tự theo các thuật toán sắp xếp vừa
nêu trên và hiển thị từng bước sắp xếp.
IV. Kết quả đạt được của đề tài
Hoàn tất tất cả các mục của phần mềm bao gồm:
+ Xây dựng được Form cho phép nhập vào dãy số có n số nguyên (dùng mảng).

+ Sử dụng ComboBox để lựa chọn các phương pháp sắp xếp.
+ Quá trình sắp xếp được hiển thị trên một ListBox (Hiện thị từng bước sắp xếp).


2

V. Bố cục của đề tài
Đề tài gồm 3 chương như sau:
CHƯƠNG 1 : TÌM HIỂU VỀ THUẬT TOÁN VÀ SẮP XẾP
CHƯƠNG 2 : NỘI DUNG CỦA CÁC PHƯƠNG PHÁP SẮP XẾP
CHƯƠNG 3 : CHƯƠNG TRÌNH DEMO


3

CHƯƠNG 1
TÌM HIỂU VỀ THUẬT TOÁN VÀ SẮP XẾP
Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị hay
phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái
ban đầu cho trước; khi các chỉ thị này được áp dụng triệt để thì sẽ dẫn đến kết quả sau
cùng như đã dự đoán trước. Nói cách khác, thuật toán là một bộ các quy tắc hay quy trình
cụ thể nhằm giải quyết một vấn đề trong một số bước hữu hạn, hoặc nhằm cung cấp một
kết quả từ một tập hợp của các dữ kiện đưa vào.
Sắp xếp là một quá trình biến đổi một danh sách các đối tượng thành một danh
sách thoả mãn một thứ tự xác định nào đó. Sắp xếp đóng vai trò quan trọng trong tìm
kiếm dữ liệu. Chẳng hạn, nếu danh sách đã được sắp xếp theo thứ tự tăng dần (hoặc giảm
dần), ta có thể sử dụng kỹ thuật tìm kiếm nhị phân hiệu quả hơn nhiều tìm kiếm tuần tự…
Trong thiết kế thuật toán, ta cũng thường xuyên cần đến sắp xếp, nhiều thuật toán được
thiết kế dựa trên ý tưởng xử lý các đối tượng theo một thứ tự xác định. Các thuật toán sắp
xếp được chia làm 2 loại: sắp xếp trong và sắp xếp ngoài. Sắp xếp trong được thực hiện

khi mà các đối tượng cần sắp xếp được lưu ở bộ nhớ trong của máy tính dưới dạng mảng.
Do đó sắp xếp trong còn được gọi là sắp xếp mảng. Khi các đối tượng cần sắp xếp quá
lớn cần lưu ở bộ nhớ ngoài dưới dạng file, ta cần sử dụng các phương pháp sắp xếp ngoài,
hay còn gọi là sắp xếp file.
1.1. Thuật toán (giải thuật) – Algorithm

1.1.1. Định nghĩa thuật toán
Thuật ngữ “algorithm” (thuật toán hoặc còn gọi là giải thuật) được gọi theo tên nhà
toán học Ả rập thế kỷ IX al-Khowarizmi, người đã viết cuốn sách về các chữ số Hindu –
cơ sở của kí hiệu số thập phân hiện đại (xem [4], trang 118). Xuất xứ ban đầu là từ
algorism, được dùng để chỉ các quy tắc thực hiện các phép tính số học trên các số thập
phân. Sau đó, vào thế kỷ XVIII algorism biến thành algorithm. Với sự quan tâm ngày
càng tăng đối với máy tính, khái niệm thuật toán đã được cho một ý nghĩa chung hơn, bao
hàm cả các thủ tục xác định để giải các bài toán, chứ không phải chỉ là thủ tục để thực
hiện các phép tính số học.
Thuật toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác
định sao cho sau khi thực hiện dãy các thao tác ấy, từ Input của bài toán ta nhận được
Output cần tìm.
Cũng có thể xem thuật toán như một công cụ để giải quyết một bài toán cụ thể.
Phát biểu bài toán sẽ chỉ định tổng quát mối quan hệ Input/Output cần thiết. Thuật toán
mô tả một thủ tục tính toán cụ thể để đạt được mối quan hệ Input/Output đó.


4

Vào khoảng những năm 1930 - 1936, lần lượt các nhà toán học K.Gödel, S.
Kleene, A. Church, A. Turing đã đề ra một số định nghĩa khác nhau cho khái niệm thuật
toán. Trong số các định nghĩa toán học khác nhau (nhưng tương đương) về thuật toán, các
khái niệm Máy Turing (1937) và Hàm đệ quy (1931-1936) được sử dụng rộng rãi hơn vì
có nhiều thuận tiện cho các nghiên cứu cả về lí thuyết lẫn thực hành.


1.1.2. Đặc trưng của thuật toán
Tính đúng đắn: Thuật toán cần phải đảm báo cho một kết quả đúng sau khi thực
hiện đói với các bộ dữ liệu đầu vào. Đây có thể nói là đặc trưng quan trọng nhất đối với
một thuật toán.
Tính dừng: thuật toán cần phải đảm bảo sẽ dừng sau một số hữu hạn bước.
Tính xác định: Các bước của thuật toán phải được phát biểu rõ ràng, cụ thể, tránh
gây nhập nhằng hoặc nhầm lẫn đối với người đọc và hiểu, cài đặt thuật toán.
Tính hiệu quả: thuật toán được xem là hiệu quả nếu như nó có khả năng giải quyết
hiệu quả bài toán đặt ra trong thời gian hoặc các điều kiện cho phép trên thực tế đáp ứng
được yêu cầu của người dùng.
Tính phổ quát: thuật toán được gọi là có tính phổ quát( phổ biến) nếu nó có thể giải
quyết được một lớp các bài toán tương tự.
Ngoài ra mỗi thuật toán theo định nghĩa đều nhận các giá trị đầu vào được gọi
chung là các giá trị dữ liệu Input. Kết quả của thuật toán( thường là một kết quả cụ thể
nào đó tùy theo các bài toán cụ thể) được gọi là Output.

1.1.3. Biểu diễn thuật toán
Thường có hai cách biểu diễn một thuật toán, cách thứ nhất là mô tả các bước thực
hiện của thuật toán, cách thứ hai là sử dụng sơ đồ giải thuật.
1.1.3.1 Mô tả các bước thực hiện
Để biểu diễn thuật toán người ta mô tả chính xác các bước thực hiện của thuật
toán, ngôn ngữ dùng để mô tả thuật toán có thể là ngôn ngữ tự nhiên hoặc một ngôn ngữ
lai ghép giữa ngôn ngữ tự nhiên với một ngôn ngữ lập trình nào đó gọi là các đoạn giả mã
lệnh.
Ví dụ: mô tả thuật toán tìm ước số chung lớn nhất của hai số nguyên.
Input: Hai số nguyên a, b.
Output: Ước số chung lớn nhất của a, b.
Thuật toán:
Bước 1: Nếu a=b thì USCLN(a, b)=a.



5

Bước 2: Nếu a > b thì tìm USCLN của
Bước 3: Nếu a < b thì tìm USCLN của

a-b và b, quay lại bước 1;
a và b-a, quay lại b ước 1;

1.1.3.2 Sử dụng sơ đồ (lưu đồ) giải thuật (flowchart)
Một trong những cách phổ biến để biểu diễn thuật toán là sử dụng sơ đồ thuật toán
(Algorithm Flowchart).
Sơ đồ thuật toán sử dụng các ký hiệu hình khối cơ bản để tạo thành một mô tả
mang tính hình thức (cách này rõ ràng hơn so với việc mô tả các bước thực hiện thuật
toán) của thuật toán. Chúng ta có thể hình dung việc sử dụng sơ đồ giải thuật để mô tả
thuật toán giống như dùng các bản vẽ để mô tả cấu trúc của các tòa nhà.
Các khối cơ bản của một sơ đồ thuật toán:

Hình 1.1.3.2 Các khối cơ bản của một sơ đồ thuật toán.
Khối 1 : Khối bắt đầu thuật toán, chỉ có duy nhất một đường ra ;
Khối 2 : Khối kết thúc thuật toán, có thể có nhiều đường vào;
Khối 3 : Thực hiện câu lệnh (có thể là một hoặc nhiều câu lệnh) ; gồm một đường
vào và một đường ra
Khối 4: Rẽ nhánh, kiểm tra biểu thức điều kiện (biểu thức Boolean), nếu biểu thức
đúng thuật toán sẽ đi theo nhánh Đúng (True), nếu biểu thức sai thuật toán sẽ đi theo
nhánh Sai (False). 
Khối 5 : Các câu lệnh nhập và xuất dữ liệu.



6

1.1.4. Độ phức tạp thuật toán - Algorithm Complexity
Thông thường để đánh giá mức độ tốt, xấu và so sánh các thuật toán cùng loại, có
thể dựa trên hai tiêu chuẩn:
+ Thuật toán đơn gàn, dễ hiểu, dễ cài đặt.
+ Dựa vào thời gian thực hiện và tài nguyên mà thuật toán sử dụng để thực hiện
trên các bộ dữ liệu.
Trên thực tế các thuật toán hiệu quả thì không dễ hiểu, các cài đặt hiệu quả cũng
không dễ dàng thực hiện và hiểu được một cách nhanh chóng. Và một điều có vẻ nghịch
lý là các thuật toán càng hiệu quà thì càng khó hiểu, cài đặt càng phức tạp lại càng hiệu
quả (không phải lúc nào cũng đúng). Vì thế để đánh giá và so sánh các thuật toán người ta
thường dựa trên độ phức tạp về thời gian thực hiện của thuật toán, gọi là độ phức tạp thuật
toán (algorithm complexity). Về bản chất độ phức tạp thuật toán là một hàm ước lượng
(có thể không chính xác) số phép tính mà thuật toán cần thực hiện (từ đó dễ dàng suy ra
thời gian thực hiện của thuật toán đối với một bộ dữ liệu input có kích thước N. N có thể
là số phần tử của mảng trong trường hợp bài toán sắp xếp hoặc tìm kiếm, hoặc có thể là
độ lớn của số trong bài toán kiểm tra số nguyên tố chẳng hạn.
1.1.4.1. Các tiêu chí đánh giá thuật toán
Khi xem xét đến độ phức tạp tính toán của thuật toán ta phải xem xét đến độ phức
tạp thời gian và độ phức tạp không gian.
Độ phức tạp không gian gắn liền với cấu trúc dữ liệu cụ thể được dùng để thực
hiện thuật toán.
Độ phức tạp thời gian: Độ phức tạp thời gian của một thuật toán có thể biểu diễn
qua số phép toán thực hiện thuật toán đó khi các giá trị đầu vào có kích thước xác định.
Độ phức tạp trong trường hợp xấu nhất là trường hợp phải dùng tối đa các phép
toán để giải bài toán theo thuật toán đang xét.
Độ phức tạp trong trường hợp trung bình, trong trường hợp này ta phải đi tìm số
trung bình các phép toán để giải bài toán trên toàn bộ các giá trị đầu vào có kích thước đã
cho.

Các thuật ngữ thường dùng cho độ phức tạp của thuật toán:
O(1)
O(logn)
O(n)
O(nlogn)
b
O(n )

Độ phức tạp hằng số
Độ phức tạp lôgarit
Độ phức tạp tuyến tính
Độ phức tạp nlogn
Độ phức tạp đa thức


7

n
Độ phức tạp hàm mũ
O(b ), b > 1
O(n!)
Độ phức tạp giai thừa
Bảng 1.1.4.2. Các thuật ngữ thường dùng cho độ phức tạp của thuật toán
1.2. Khái niệm về sắp xếp
Sắp xếp được xem là một trong những lĩnh vực nghiên cứu cổ điển của khoa học
máy tính. Trước khi đi vào các thuật toán chi tiết chúng ta cần nắm vững một số khái
niệm cơ bản sau:
 Một trường (field) là một đơn vị dữ liệu nào đó chẳng hạn như tên, tuổi, số điện
thoại của một người ...
 Một bản ghi (record) là một tập hợp các trường

 Một file là một tập hợp các bản ghi
Sắp xếp (sorting) là một quá trình xếp đặt các bản ghi của một file theo một thứ tự
nào đó. Việc xếp đặt này được thực hiện dựa trên một hay nhiều trường nào đó, và các
thông tin này được gọi là khóa xắp xếp (key). Thứ tự của các bản ghi được xác định dựa
trên các khóa khác nhau và việc sắp xếp đối được thực hiện đối với mỗi khóa theo các thứ
tự khác nhau. Chúng ta sẽ tập trung vào các thuật toán xắp xếp và giả sử khóa chỉ gồm 1
trường duy nhất. Hầu hết các thuật toán xắp xếp được gọi là các thuật toán xắp xếp so
sánh: chúng sử dụng hai thao tác cơ bản là so sánh và đổi chỗ (swap) các phần tử cần sắp
xếp.
Các bài toán sắp xếp đơn giản được chia làm hai dạng:
Sắp xếp trong (internal sorting): Dữ liệu cần sắp xếp được lưu đầy đủ trong bộ nhớ trong
để thực hiện thuật toán sắp xếp.
Sắp xếp ngoài (external sorting): Dữ liệu cần sắp xếp có kích thước quá lớn và không thể
lưu vào bộ nhớ trong để sắp xếp, các thao tác truy cập dữ liệu cũng mất nhiều thời gian
hơn.
Khi khảo sát bài toán sắp xếp, ta sẽ phải làm việc nhiều với một khái niệm gọi là nghịch
thế.
1.3. Khái niệm nghịch thế
Xét một mảng các số a0,a1, …, an. Nếu có i < j và ai > aj, thì ta gọi đó là một nghịch
thế.
Ví dụ : Mảng chưa sắp xếp sẽ có nghịch thế.
Mảng đã có thứ tự sẽ không chứa nghịch thế. Khi đó a 0 sẽ là phấn tử nhỏ nhất rối
đến a1, a2.


8

Như vậy, để sắp xếp một mảng, ta có thể tìm cách giảm số các nghịch thế trong
mảng này bằng cách hoán vị các cặp phần tử a i, aj nếu có i < j và ai > aj theo một quy luật
nào đó.

Cho trước một dãy số a1,a2, …, an được lưu trữ trong cấu trúc dữ liệu mảng.
A : int [1..n] array
Sắp xếp dãy số a1,a2, …, an là thực hiện việc bố trí lại các phần tử sao cho hình
thành được dãy mới ak1, ak2, …, akn có thứ tự (giả sử xét thứ tự tăng) nghĩa là a ki > aki-1. Mà
để quyết định được những tình huống cần thay đổi vị trí các phần tử trong dãy, cần dựa
vào kết quả của một loạt phép so sánh. Chính vì vậy, hai thao tác so sánh và gán là các
thao tác cơ bản của hầu hết các thuật toán sắp xếp.
Khi xây dựng một thuật toán sắp xếp cần chú ý tìm cách giảm thiểu những phép so
sánh và đổi chổ không cần thiết để tăng hiệu quả của thuật toán. Đối với các dãy số được
lưu trữ trong bộ nhớ chính, nhu cầu tiết kiệm bộ nhớ được đặt nặng, do vậy những thuật
toán sắp xếp đòi hỏi cấp phát thêm vùng nhớ để lưu trữ dãy kết quả ngoài vùng nhớ lưu
trữ dãy số ban đầu thường ít được quan tâm. Thay vào đó, các thuật toán sắp xếp trực tiếp
trên dãy số ban đầu – gọi là các thuật toán sắp xếp tại chổ - lại được đầu tư phát triển.
1.4. Các tiêu chuẩn đánh giá một thuật toán sắp xếp
Các thuật toán sắp xếp có thể được so sánh với nhau dựa trên các yếu tố sau đây:
• Thời gian thực hiện (run-time): số các thao tác thực hiện (thường là số các phép
so sánh và hoán đổi các bản ghi).
• Bộ nhớ sử dụng (Memory): là dung lượng bộ nhớ cần thiết để thực hiện thuật
toán ngoài dung lượng bộ nhớ sử dụng để chứa dữ liệu cần sắp xếp.
Một vài thuật toán thuộc loại “in place” và không cần (hoặc cần một số cố định)
thêm bộ nhớ cho việc thực hiện thuật toán.
Các thuật toán khác thường sử dụng thêm bộ nhớ tỉ lệ thuận theo hàm tuyến tính
hoặc hàm mũ với kích thước file sắp xếp.
Tất nhiên là bộ nhớ sử dụng càng nhỏ càng tốt mặc dù việc cân đối giữa thời gian
và bộ nhớ cần thiết có thể là có lợi.
• Sự ổn định (Stability): một thuật toán được gọi là ổn định nếu như nó có thể giữ
được quan hệ thứ tự của các khóa bằng nhau (không làm thay đổi thứ tự của các khóa
bằng nhau).



9

CHƯƠNG 2
NỘI DUNG CỦA CÁC PHƯƠNG PHÁP SẮP XẾP
2.1.

Phương pháp sắp xếp nổi bọt (Bubble sort)

2.1.1. Giải thuật
- Sắp xếp nổi bọt (bubble sort) là một thuật toán sắp xếp đơn giản, so sánh hai phần tử
đầu, nếu phần tử đứng trước lớn hơn phần tử đứng sau thì đổi chỗ chúng cho nhau. Tiếp
tục làm như vậy với cặp phần tử tiếp theo cho đến cuối tập hợp dữ liệu. Sau đó, quay lại
với hai phần tử đầu cho đến khi không còn cần phải đổi chỗ nữa. Nó có tên gọi này từ
hình ảnh của các "bọt" khí nhẹ hơn được nổi lên trên. Nó sử dụng phép so sánh các phần
tử nên là một sắp xếp kiểu so sánh.
- Các bước tiến hành như sau :
+ Bước 1: i := 1 ; // Lần xử lí đầu tiên.
+ Bước 2: j : = n ; // duyệt từ cuối dãy ngược về vị trí i .
Trong khi ( j > i) thực hiện :
Nếu a[j]+ Bước 3: i = i + 1; // Lần xử lí kế tiếp
Nếu i > n-1 : hết dãy. Dừng.
Ngược lại : Lặp lại bước 2 . Cho đến khi j=i thì dừng thuật toán.
2.1.2. Đánh giá giải thuật
Đối với giải thuật nổi bọt, số lượng các phép so sánh xảy ra không phụ thuộc vào
tình trạng của dãy số ban đầu, nhưng số lượng phép toán hoán vị thực hiện tuỳ thuộc vào
kết quả so sánh, có thể ước lượt trong từng trường hợp như sau:
Trường hợp
Số lần so sánh
Số lần hoán vị

Tốt nhất
0
Xấu nhất
Bảng 2.1.2 Bảng đánh giá giải thuật sắp xếp nổi bọt


10

Nhận xét:
Bubblesort có các khuyết điểm sau : không nhận diện được tình trạng dãy đã có
thứ tự hay có thứ tự từng phần. Các phần tử nhỏ được đưa về vị trí đúng rất nhanh, trong
khi các phần tử lớn lại được đưa về vị trí đúng rất chậm.
2.1.3. Ví dụ
Cho dãy số a gồm các phần tử sau : 12 2 8 5 1 6 4 15
12

2

8

5

1

6

i=1
2

12


8

5

1

4

6

15

5

4

6

15

j=5
12

8

i=1

1
j=4


2

1

i=1

j=2

1

2

12

8

5

4

6

15

12

8

5


4

6

15

5

6

15

5

6

15

i=2

1

2

j=6

12

8


i=2
1

15

j=7

i=1
2

4

2
i=2

4
i=5

12

4
j=4

8


11

1


2

4

12

8

i=3

5

6

15

j=6

Hình 2.1.3 Sơ đồ ví dụ về sắp xếp nổi bọt
Cứ tiếp tục như vậy và tăng dần i lên cho đến khi i > n-1 thì dừng và dãy đã được
sắp xếp xong.
Dãy khi sắp xếp xong là : 1 2 4 5 6 8 12 15
2.2.

Phương pháp sắp xếp trộn (Merge Sort)

2.2.1. Nguyên tắc sắp xếp bằng phép trộn
Để sắp xếp dãy a1, a2,...,an, giải thuật MergeSort dựa trên nhận xét sau:
Mỗi dãy a1, a2,...,an bất kỳ đều có thể coi như là một tập hợp các dãy con liên tiếp mà

mỗi dãy con đều đã có thứ tự. Ví dụ: 12, 2, 8, 5, 1, 6, 4, 15 có thể coi như gồm 5 dãy con
không giảm (12); (2,8); (5); (1,6); (4,15).
Dãy đã có thứ tự coi như có một dãy con.
Như vậy, một cách tiếp cận để sắp xếp dãy là tìm cách làm giảm dãy con không
giảm của nó. Đây chính là hướng tiếp cận của thuật toán sắp xếp theo phương pháp trộn.
Trong phương pháp MergeSort, mấu chốt của vấn đề là cách phân hoạch dãy ban
đầu thành các dãy con. Sau khi phân hoạch xong, dãy ban đầu sẽ tách ra thành 2 dãy phụ
theo nguyên tắc phân phối đều luân phiên. Trộn từng cặp dãy con của hai dãy phụ thành
một dãy con của dãy ban đầu, ta sẽ nhận lại dãy ban đầu nhưng với số lượng dãy con ít
nhất giảm đi một nửa. Lặp lại qui trình trên sau một số bước, ta sẽ nhận lại được một dãy
chỉ gồm 1 dãy con không giảm. Nghĩa là dãy ban đầu đã được sắp xếp.
2.2.2. Giải thuật
Giải thuật trộn trực tiếp là phương pháp đơn giản nhất. Việc phân hoạch thành các
dãy con đơn giản chỉ là tách dãy n phẩn tử thành n dãy con. Đòi hỏi của thuật toán về tính
có thứ tự của các dãy con luôn được thõa trong cách phân hoạch này vì dãy gồm một phần
tử luôn có thứ tự. Cứ mỗi lần tách rồi trộn, chiều dài của các dãy con sẽ được nhân đôi.
Các bước thực hiện thuật toán như sau:


12

Bước 1: // Chuẩn bị , k = 1; // k là chiều dài của dãy con trong bước thực hiện
Bước 2: Tách dãy a1 , a2 ,…, an thành 2 dãy b, c theo nguyên tắc luân phiên từng
nhóm k phần tử:
b= a1 , ak , a2k+1 ,…, a3k , .
c= ak+1 ,., a2k , a3k+1 ,…, a4k , .
Bước 3: Trộn từng cặp dãy con gồm k phần tử của 2 dãy b, c vào a.
Bước 4 : k = k*2; Nếu k < n thì trở lại bước 2. Ngược lại : Dừng.
2.2.3. Đánh giá giải thuật
Ta thấy rằng số lần lặp của bước 2 và bước 3 trong thuật toán MergeSort bằng

log2n do sau mỗi lần lặp giá trị của k tăng lên gấp đôi. Dễ thấy, chi phí thực hiện bước 2
và bước 3 tỉ lệ thuận với n. Như vậy, chi phí thực hiện của giải thuật MergeSort sẽ là
O(nlog2n). Do không sử dụng thông tin nào về đặc tính của dãy cần sắp xếp, nên trong
mọi trường hợp của thuật toán chi phí là không đổi. Đây cũng chính là một trong những
nhược điểm lớn của thuật toán.
2.2.4. Ví dụ
Cho dãy số a : 12 2 8 5 1 6 4 15
k=1;

12

2

8

1

5

6

4

15

Bước tách a thành b và c

2

12


5

b=

12

8

1

4

c=

2

5

6

15

8

1

6

4


15


13

2

12

5

1

8

6

4

15

Bước tách a thành b và c
b=

2

12

1


6

c=

5

8

4

15

1

2

6

12

4

5

8

15

1


2

6

12

4

5

8

15

Bước tách a thành b và c

1

2

4

b=

1

2

6


12

c=

4

5

8

15

5

6

8

12

15

Hình 2.1.3 Sơ đồ ví dụ về sắp xếp nổi bọt
Dãy khi sắp xếp xong là : 1 2 4 5 6 8 12 15
2.3.

Phương pháp sắp xếp vun đống (Heap Sort)

2.3.1. Định nghĩa Heap

Giả sử xét trường hợp sắp xếp tăng dần, khi đó heap được định nghĩa là một dãy các phần
tử a1, a2, …, ar thỏa các quan hệ sau với mọi i [l,r] :


14

1/.
ai >= a2i
2/.
ai >= a2i+1
{(ai, a2i), (ai, a2i+1) là các cặp phần tử liên đới}
Heap có các tính chất sau :
Tính chất 1: Nếu a1, a2, …, ar là một heap thì khi cắt bỏ một số phần tử ở hai đầu
của heap, dãy con còn lại vẫn là một heap.
Tính chất 2: Nếu a1, a2, …, an là một heap thì phần tử a1 (đầu heap) luôn là phần
tử lớn nhất trong heap.
Tính chất 3: Mọi dãy a1, a2, …, ar với 2l > r là một heap.
2.3.2. Giải thuật
Giải thuật heapsort trải qua hai 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 :
Bước 1: Đưa phần tử nhỏ nhất về vị trí đúng ở cuối dãy :
r : = n ; Hoán vị (a1, ar);
Bước 2: Loại bỏ phần tử nhỏ nhất ra khỏi heap : r : = r – 1;
Hiệu chỉnh phần còn lại của dãy từ a1, a2, …, ar thành một heap.
Bước 3: Nếu r > 1 (heap còn phần tử): Lặp lại bước 2. Ngược lại :Dừng.
2.3.3. Đánh giá giải thuật
Việc đánh giá giải thuật heapsort rất phức tạp, nhưng đã chứng minh được trong
trường hợp xấu nhất độ phức tạp là O(nlog2n).
2.3.4. Ví dụ

Cho dãy số a : 12 2 8 5 1 6 4 15
Giai đoạn 1 : Hiệu chỉnh dãy ban đầu thành heap
12

2

8

5

1

6

2

8
i=3

15

15

Phần tử liên đới

i=4
12

4


1

6

4

Phần tử liên đới

5


15

12

2

8

15

8

2

i=1
12

15


6

4

5

1

6

4

5

Lan truyền việc hiệu chỉnh

i=1

12

1

Phần tử liên đới

i=2

12

15


8

5

1

6

4

2

Phần tử liên đới
15

8

5

1

6

4

2

6

4


2

Giai đoạn 2: Sắp xếp dãy số dựa trên heap:
12

15

8

5

1

r=8
Hiệu chỉnh lại Heap
12

5

8

2

1

6

4


15

12

5

8

5

1

6

4

15

r=7


×