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

Cài đặt mô phỏng thuật toán sắp xếp chọn trực tiếp và đổi chỗ trực tiếp

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 (3.11 MB, 60 trang )

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN MÔN HỌC

ĐỀ TÀI : CÀI ĐẶT MƠ PHỎNG THUẬT TỐN
SẮP XẾP CHỌN TRỰC TIẾP, ĐỔI CHỖ TRỰC TIẾP

GVHD: Đào Minh Châu
SVTH:
Nguyễn Anh Tài
Phan Thị Kim Ngân

Tp.Hồ Chí Minh, Tháng 08, năm 2021

2033183007
2033188001


MỤC LỤC
MỤC LỤC.......................................................................................................................... i
DANH MỤC HÌNH ẢNH................................................................................................iv
DANH MỤC BẢNG.........................................................................................................vi
LỜI CẢM ƠN.................................................................................................................. vii
LỜI MỞ ĐẦU.................................................................................................................... 1
CHƯƠNG I: TỔNG QUAN VỀ THUẬT TỐN TÌM KIẾM VÀ THUẬT TỐN SẮP
XẾP.................................................................................................................................... 3
1.1 Khái qt về các thuật tốn tìm kiếm và thuật tốn sắp xếp:...................................3
1.2 Phân loại thuật tốn tìm kiếm:..................................................................................4
1.2.1 Phân loại dựa theo dữ liệu:...............................................................................5


1.2.2 Phân loại theo độ phức tạp của thuật toán:........................................................5
1.3 Phân loại thuật toán sắp xếp :...................................................................................5
1.3.1 Phân loại theo độ phức tạp của thuật toán:........................................................5
1.3.2 Phân loại dựa theo có phải là một phương pháp so sánh hay khơng:................6
1.3.3 Phân loại dựa theo khả năng thích ứng:............................................................6
1.3.4 Phân loại dựa theo tính ổn định của thuật tốn:................................................6
CHƯƠNG 2: MỘT SỐ THUẬT TỐN THƠNG DỤNG.................................................1
2.1 Thuật tốn sắp xếp đổi chỗ trực tiếp – Interchange sort:..........................................1
2.1.1 Ý tưởng thuật toán:...........................................................................................1
2.1.2 Giải thuật Interchange sort:..............................................................................1
2.1.3 Cài đặt thuật toán Interchange sort:..................................................................5
2.1.4 Đánh giá thuật toán Interchange sort:...............................................................5
2.2 Thuận toán sắp xếp chọn trực tiếp – Selection sort:.................................................6
2.2.1 Ý tưởng thuật toán:...........................................................................................6
2.2.2 Giải thuật Selection sort:..................................................................................6
i


2.2.3 Cài đặt thuật toán Selection sort:....................................................................10
2.2.4 Đánh giá thuật toán Selection sort:.................................................................10
2.3 Thuật toán sắp xếp nhanh – Quick sort:.................................................................11
2.3.1 Ý tưởng thuật toán Quick sort:........................................................................11
2.3.2 Giải thuật Quick sort:....................................................................................12
2.3.3 Cài đặt thuật toán Quick sort:.........................................................................15
2.3.4 Đánh giá thuật tốn Quick sort:.....................................................................16
2.4 Thuật tốn tìm kiếm tuyến tính-Linear search:......................................................16
2.4.1 Ý tưởng thuật toán:.........................................................................................17
2.4.2 Giải thuật Linear search:.................................................................................17
2.4.3 Cài đặt thuật toán Linear search:....................................................................19
2.4.4 Đánh giá thuật toán Linear search:..................................................................20

2.5 Thuật tốn tìm kiếm tuần tự-Binary search:...........................................................20
2.5.1 Ý tưởng thuật toán:.........................................................................................20
2.5.2 Giải thuật Binary search:................................................................................20
2.5.3 Cài đặt thuật toán Binary search:....................................................................22
2.5.4 Đánh giá thuật tốn:........................................................................................23
CHƯƠNG III: CHƯƠNG TRÌNH MINH HỌA THUẬT TỐN....................................24
3.1 Giới thiệu cơng cụ và ngơn ngữ sử dụng:..............................................................24
3.1.1 Tổng quan về ngơn ngữ lập trình Csharp:.......................................................24
3.2 Chương trình minh họa thuật tốn:........................................................................24
3.2.1 Mơ tả chung về chương trình:.........................................................................25
3.2.2 Các tính năng của chương trình:.....................................................................25
3.3 Một số hình ảnh hoạt động của chương trình:........................................................25
3.3.1 Khởi tạo chương trình:....................................................................................25
3.3.2 Mơ phỏng thuật tốn Sắp xếp trực tiếp (InterChange Sort):...........................30
ii


3.3.3 Mơ phỏng thuật tốn Sắp xếp Chọn trực tiếp (Selection Sort):.......................32
3.3.4 Mơ phỏng thuật tốn Sắp xếp nhanh (Quick Sort):.........................................36
3.3.5 Mơ phỏng thuật tốn Tìm kiếm tuyến tính (Linear Search):...........................38
3.3.6 Mơ phỏng thuật tốn Tìm kiến nhị phân (Binary Search):..............................41
TÀI LIỆU THAM KHẢO................................................................................................45
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN...........................................................46

iii


DANH MỤC HÌNH ẢNH
Hình 2.1 Lưu đồ thuật toán sắp xếp đổi chỗ trực tiếp InterChange Sort............................2
Hình 2.2 Lưu đồ thuật toán sắp xếp đổi chỗ chọn trực tiếp Selection Sort........................8

Hình 2.3 Lưu đồ thuật toán Sắp xếp nhanh QuickSort.....................................................14
Hình 2.4 Lưu đồ thuật toán tìm kiếm tuyến tính Linear Search........................................18
Hình 2.5 Lưu đồ thuật toán tìm kiếm nhị phân Binary Search.........................................21
Hình 3.1 Giao diện của Chương trình Mơ phỏng thuật toán...........................................26
Hình 3.2 Khởi tạo dãy số tự động với số lượng phần tử nhập từ bàn phím......................27
Hình 3.3 Khởi tạo dãy số bằng tay với các giá trị tự chọn...............................................28
Hình 3.4 Dãy số tự tạo hồn chỉnh gồm có 5 phần tử......................................................28
Hình 3.5 Các chức năng của chương trình......................................................................29
Hình 3.6 Khởi tạo i = 0; j = i + 1;...................................................................................30
Hình 3.7 So sánh A[i] và A[j] và tiến hành đổi chỗ hai phần tử......................................31
Hình 3.8 Hai phần tử đã tiến hành đổi chỗ thành cơng...................................................31
Hình 3.9 Tiếp tục cho đến khi dãy số được sắp xếp..........................................................31
Hình 3.10 Khởi tạo tự dộng và chọn thứ tự Giảm............................................................32
Hình 3.11 Khởi tạo i và j và max =A[i] = 34. So sánh A[i] và A[j].................................33
Hình 3.12 Lúc này đã tìm được A[1] =85 > A[0]. Tiến hành gán Max cho A[1]. Tiếp tục
tìm giá trị A[j] > Max .....................................................................................................33
Hình 3.13 j đến cuối mảng và khơng tìm được giá trị A[j] > Max. Tiến hành đổi chỗ.....34
Hình 3.14 Tiếp tục lặp lại cho đến khi hồn thành...........................................................34
Hình 3.15 Hồn thành sắp xếp chọn trực tiếp..................................................................35
Hình 3.16 Giao diện khi khởi tạo chức năng Sắp xếp nhanh...........................................36
Hình 3.17 Hoán vị hai phần tử thoả điều kiện thuật toán................................................37
Hình 3.18 Phân hoạch đoạn bên trái...............................................................................37
Hình 3.19 Sắp xếp đoạn bên trái thành cơng...................................................................37
iv


Hình 3.20 Tiến hành phân hoạch đoạn bên phải..............................................................38
Hình 3.21 Mơ phỏng tìm kiếm tuyến tính và nhập số cần tìm X = 50...............................38
Hình 3.22 Khơng có phần tử X = 50 và thơng báo...........................................................39
Hình 3.23 Khởi tạo dãy số khác và tìm X = 28 thành cơng..............................................40

Hình 3.24 Khởi tạo dãy số và tiến hành sắp xếp trước khi tìm kiếm................................41
Hình 3.25 Sắp xếp thành cơng và bắt đầu tìm X = 28......................................................41
Hình 3.26 Do X = 28 < Mid = 53 nên tiến hành phân hoạch đoạn bên trái....................42
Hình 3.27 Khơng tìm thấy giá trị X = 28 trong mảng......................................................42
Hình 3.28 Do X = 78 > mid = 53 nên tiến hành phân hoạch đoạn bên phải...................43
Hình 3.29 Đã tìm thấy X = 78 và kết thúc thuật toán.......................................................43

v


DANH MỤC BẢNG
Bảng 2.1 Cài đặt thuật toán sắp xếp Đổi chỗ trực tiếp bằng C/C++.................................5
Bảng 2.2 Bảng đánh giá độ phức tạp của thuật toán Sắp xếp đổi chỗ trực tiếp.................6
Bảng 2.3 Cài đặt thuật toán Selection Sort bằng C/C++.................................................10
Bảng 2.4 Ưu & Nhược điểm của thuật toán Selection Sort..............................................10
Bảng 2.5 Bảng đánh giá độ phức tạp của thuật toán QuickSort......................................16
Bảng 2.6 Bảng đánh giá độ phức tạp của thuật toán BinarySearch..........................................23

vi


LỜI CẢM ƠN
Đầu tiên nhóm em xin chân thành cảm ơn quý thầy cô, chúng em xin phép được
bày tỏ lòng biết ơn sâu sắc đến tất cả các Thầy cô và bạn bè đã tạo điều kiện hỗ trợ, giúp
đỡ chúng em trong suốt thời gian qua để nhóm có thể thực hiện tốt đề tài này
Với lịng biết ơn sâu sắc nhất, em xin gửi lời tri ân đến quý Thầy Cô ở Khoa Công
Nghệ Thông Tin trường Đại học Công nghiệp Thực phẩm, và đặc biệt là cô giáo Đào
Minh Châu - người hướng dẫn trực tiếp cho nhóm em trong q trình thực hiện đề tài.
Cảm ơn quý Thầy Cô đã truyền đạt vốn kiến thức quý báu và nhiệt tình giúp đỡ chúng
em mỗi lúc gặp khó khăn khi thực hiện đề tài, để chúng em có hồn thành đề tài

Đồ án được thực hiện trong vòng 8 tuần. Chúng em biết bước đầu sẽ cịn rất nhiều
hạn chế và khơng tránh khỏi những thiếu sót ,nhóm em rất mong nhận được những ý kiến
đóng góp q báu của q Thầy Cơ để có thể hoàn thiện hơn đồng thời bổ sung, nâng cao
kiến thức của mình cho thời gian sắp tới.
Em xin chân thành cảm ơn

vii


LỜI MỞ ĐẦU

1. Lý do chọn đề tài:
Trong toán học và khoa học máy tính, một thuật tốn, cịn gọi là giải thuật, là
một tập hợp hữu hạn các hướng dẫn được xác định rõ ràng, có thể thực hiện được bằng
máy tính, thường để giải quyết một lớp vấn đề hoặc để thực hiện một phép tính. Các
thuật tốn luôn rõ ràng và được sử dụng chỉ rõ việc thực hiện các phép tính, xử lý dữ
liệu, suy luận tự động và các tác vụ khá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 một dãy các thao tác ấy, từ Input của bài tốn, ta nhận được
Output cần tìm, giải quyết được u cầu bài toán đặt ra. Mọi sản phẩm phần mềm nếu
muốn thành cơng và có sức ảnh hưởng đều cần phải áp dụng đúng và chính xác các thuật
tốn. Thuật tốn có thể được minh họa bằng ngơn ngữ tự nhiên (natural language), bằng
sơ đồ (flow chart) hoặc bằng mã giả (pseudo code). Trong thực tế, thuật toán thường
được minh họa hay thể hiện bằng mã giả dựa trên một hay một số ngơn ngữ lập trình nào
đó (thường là ngơn ngữ mà người lập trình chọn để cài đặt thuật toán),chẳng hạn như
C/C++, Pascal, ...
Khi đã xác định được cấu trúc dữ liệu thích hợp, lập trình viên sẽ bắt đầu tiến hành
xây dựng thuật toán tương ứng theo yêu cầu của bài toán đặt ra trên cơ sở của cấu trúc dữ
liệu đã được chọn. Để giải quyết một vấn đề có thể có nhiều phương pháp, do vậy sự lựa
chọn phương pháp phù hợp là một việc mà lập trình viên phải cân nhắc và tính tốn cẩn

thận. Sự lựa chọn này cũng có thể góp phần đáng kể trong việc tối giản hóa cơng việc của
lập trình viên trong phần cài đặt thuật tốn trên một ngơn ngữ cụ thể.
Thuật tốn tìm kiếm (search algorithm) và Thuật toán sắp xếp (sort algorithm)
là một trong top các thuật toán cơ bản quan trọng và được sử dụng phổ biến. Đây cũng
chính là thuật tốn cơ bản mà mọi lập trình viên đều phải nắm rõ để có thể mở rộng, phát
triển và giải quyết những bài toán phức tạp hơn . Chính vì tầm quan trọng của nó nên
chúng em đã chọn đề tài trên
Dưới sự hướng dẫn của cô Đào Minh Châu và vận dụng kiến thức đã học em đã
thực hiện đề tài “Cài đặt mơ phỏng thuật tốn sắp xếp chọn trực tiếp và đổi chỗ trực
tiếp”.

1


2. Mục tiêu:


Nắm vững kiến thức của thuật toán sắp xếp chon trực tiếp , đổi chỗ trực tiếp.

Quick sort, tìm kiếm tuyến tính, tìm kiếm nhị phân
 Xây dựng chương trình mơ phỏng hai thuật tốn tìm kiếm ( Linear Search và
Binary Search) và ba thuật toán sắp xếp ( Interchange Sort, Selection Sort và Quick Sort )
3. Bố cục đề tài:
Bài báo cáo gồm 3 chương:




Chương I: Tổng quan về thuật tốn tìm kiếm và thuật tốn sắp xếp
Chương II: Một số thuật tốn tìm kiếm và thuật tốn sắp xếp thơng dụng

Chương III: Cài đặt chương trình mơ phịng thuật tốn tìm kiếm và thuật tốn sắp

xếp bằng C#.

2




CHƯƠNG I: TỔNG QUAN VỀ THUẬT TỐN TÌM KIẾM
VÀ THUẬT TỐN SẮP XẾP
1.1 Khái qt về các thuật tốn tìm kiếm và thuật toán sắp xếp:
Trong thực tế, khi thao tác, khai thác dữ liệu chúng ta hầu như lúc nào cũng phải
thực hiện thao tác tìm kiếm. Trong khoa học máy tính và trong tốn học, bài tốn tìm
kiếm là bài tốn tìm kiếm một phần tử trong danh sách các phần tử xem nó có tồn tại hay
khơng và ở vị trí nào trong danh sách đã cho. Việc tìm kiếm nhanh hay chậm tùy thuộc
vào trạng thái và trật tự của danh sách đó. Đầu vào của bài tốn là một danh sách có thể
chứa hoặc khơng chứa phần tử mà ta cần tìm. Trường hợp thường gặp là tìm một phần tử
là số trong danh sách là dãy các số cho trước.
Tìm kiếm phần tử X trong danh sách (dãy) có N phần tử A(0),A(1),...A(n-1) là quá
trình so sánh X theo một cách thức, trình tự nào đó với các phần tử của dãy đã cho dựa
trên thơng tin lưu tại mỗi phần tử để tìm xem có phần tử X trong dãy hay khơng. Như vậy
thao tác cơ bản của thuật tốn tìm kiếm chính là so sánh, khi xây dựng thuật tốn tìm
kiếm cần hạn chế thấp nhất số lần so sánh để tối ưu thuật tốn
Trong khoa học máy tính và trong tốn học, bài toán sắp xếp là bài toán sắp xếp sao
cho các phần tử của một danh sách theo thứ tự nhất định (tăng dần, giảm dần). Đầu vào
của bài toán là danh sách chưa các phần tử chưa sắp xếp, đầu ra là một danh sách đã sắp
xếp. Thường ta hay xét trường hợp các phần tử trong danh sách cần sắp xếp là các số và
sắp xếp theo chiều tăng dần.



Sắp xếp danh sách (dãy) có N phần tử A(0), A(1), ..., A(n-1) là quá trình xử lý các

phần tử trong danh sách để đặt chúng theo một thứ tự thỏa mãn một số yêu cầu nào đó
dựa trên thông tin lưu tại mỗi phần tử. Để quyết định có cần thay đổi vị trí các phần tử
trong dãy, phải dựa vào kết quả của một loạt phép so sánh. Như vậy, hai thao tác cơ bản
của giải thuật sắp xếp là so sánh và đổi chỗ, khi xây dựng một thuật tố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 giải thuật. Ðối với các danh sách được lưu trữ trong bộ nhớ chính, nhu cầu tiết kiệm
bộ nhớ được xem xét ưu tiên hàng đầu, do vậy những giải thuật 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ữ danh sách ban đầu, thường
3


ít được quan tâm. Thay vào đó, các giải thuật sắp xếp trực tiếp trên danh sách ban đầu gọi là các giải thuật sắp xếp tại chỗ - lại được đầu tư phát triển. Để sắp xếp một danh sách
chưa có thứ tự thành danh sách có thứ tự (giả sử có thứ tự tăng), ta phải tiến hành triệt
tiêu tất cả các cặp nghịch thế trong danh sách, hay nói cách khác là tìm cách sắp xếp lại
danh sách để sao cho tất cả các cặp đều là thuận thế.
Với khoa học máy máy tính, bài tốn tìm kiếm và sắp xếp với đã thu hút rất nhiều
nghiên cứu của các nhà khoa học và là chủ đề nhận được nhiều sự quan tâm nhất trong
lĩnh vực công nghệ
Thuật tốn tìm kiếm và sắp xếp là hai trong số các thuật tốn quan trọng nhất trong
lập trình. Hiện tại vẫn được các lập trình viên, các nhà khoa học không ngừng nghiên cứu
và phát triển để đưa ra giải thuật tốt nhất. Hiện nay đã có hơn 40 thuật toán sắp xếp được
phát minh trên thế giới.
Các thuật tốn tìm kiếm và sắp xếp được ứng dụng thực tế rất nhiều trong các
chương trình, ứng dụng. Hầu hết các sản phẩm phần mềm đều ứng dụng các thuật tốn
này. Chúng có thể sử dụng để xử lý cơ sở dữ liệu, xây dựng các tính năng, modun cho
phần mềm . . .
Một số ví dụ về các tính năng cần sử dụng thuật tốn tìm kiếm và thuật tốn sắp

xếp:


Quản lý, tìm kiếm file, sắp xếp các file, data dựa vào ngày tạo, dung lượng file,

tên file
 Các dạng bảng xếp hạng
 Tìm kiếm sản phẩm, sắp xếp theo giá sản phẩm….
Đối với các nguồn dữ liệu đầu vào khác nhau thì lại cần phải áp dụng thuật tốn phù
hợp nhất để chương trình được tối ưu nhất. Thuật tốn hồn tồn có thể ảnh hưởng tới tốc
độ của sản phẩm cũng như trải nghiệm người dùng.
Thuật toán tìm kiếm và thuật tốn sắp xếp cũng cực kì quan trọng đối với các lập
trình viên mới bắt đầu học tập. Tìm hiểu thuật tốn giúp cải thiện khả năng tư duy về giải
thuật của bản thân đồng thời cũng là một kiến thức cần thiết cho công việc sau này.

1.2

Phân loại thuật tốn tìm kiếm:

Thuật tốn sắp xếp có thể phân loại theo nhiều cách khác nhau dựa trên tính chất và
đặc điểm của thuật tốn.
4


1.2.1 Phân loại dựa theo dữ liệu:
 Dữ liệu chưa được sắp xếp : Linear search
 Dữ liệu đã sắp xếp : Binary search
1.2.2 Phân loại theo độ phức tạp của thuật tốn:
Độ phức tạp tính tốn hoặc đơn giản là độ phức tạp của thuật toán là lượng tài
nguyên cần thiết để chạy nó. Độ phức tạp thường đánh giá dựa trên thời gian chạy và bộ

nhớ sử dụng của thuật tốn.
Dựa vào tính chất này, có thể chia thuật tốn tìm kiếm thành 3 loại:



Độ phức tạp xấu O(n): Linear search
Độ phức tạp trung bình O(log n): Binary search, Tenary search ( tìm kiếm tam

phân)…
 Độ phức tạp tốt O (log [sqrt (n)] or log(log(n))): Jump search, interpolation
search…

1.3

Phân loại thuật tốn sắp xếp :

Thuật tốn sắp xếp có thể phân loại theo nhiều cách khác nhau dựa trên tính chất và
đặc điểm của thuật tốn.
1.3.1 Phân loại theo độ phức tạp của thuật tốn:
Độ phức tạp tính tốn hoặc độ phức tạp của thuật toán là lượng tài nguyên cần thiết
để chạy nó. Độ phức tạp thường đánh giá dựa trên thời gian chạy và bộ nhớ sử dụng của
thuật tốn.
Dựa vào tính chất này, có thể chia thuật toán sắp xếp thành 3 loại:




Độ phức tạp tốt O(n log n): Heap sort, Merge sort, IntroSort . . .
Độ phức tạp trung bình O(
): Bitonic sorter, Sorting network. . .

Độ phức tạp xấu O ( ): Bubble sort, Insertion sort, Selection sort

Một số thuật tốn có thể có độ phức tạp tốt ở mức O(n). Tuy nhiên trường hợp này
chỉ đúng với một số dữ liệu đầu vào và trong các điều kiện phần cứng nhất định. Ở đây ta
phân loại dựa theo trung bình của độ phức tạp thuật toán.

5


1.3.2 Phân loại dựa theo có phải là một phương pháp so sánh hay khơng:
Thuật tốn được gọi là có sử dụng phương pháp so sánh nếu chúng chỉ sử dụng toán
tử so sánh để kiểm tra giữa hai phần tử.



Sắp xếp so sánh: Bubble Sort, Quicksort, Tree sort, Timsort, Shell sort . . .
Sắp xếp không so sánh: Counting sort, Flashsort, Bucke tsort . . .

1.3.3 Phân loại dựa theo khả năng thích ứng:
Khả năng thích ứng ở đây chính là thuật tốn có bị ảnh hưởng bởi dữ liệu đầu vào
hay không. Với mỗi dữ liệu đầu vào khác nhau thì tốc độ giải thuật có thể bị ảnh hưởng
hoặc không. Đặc điểm này cũng giúp ta phân loại được thuật tốn sắp xếp.



Sắp xếp thích ứng: Merge sort, Heapsort, Intro sort . . .
Sắp xếp khơng thích ứng: Bubble sort, Quicksort, . . .

1.3.4 Phân loại dựa theo tính ổn định của thuật tốn:
Hai phần tử trong dãy có các giá trị bằng nhau, sau khi sắp xếp thứ tự tương quan

của chúng không thay đổi so với đầu vào. Tức phần tử nào đứng trước sau khi sắp xếp
vẫn đứng trước.



Sắp xếp ổn định: Bubble sort, Insertion sort . . .
Sắp xếp không ổn định: Quicksort, Heapsort . . .

6


CHƯƠNG 2: MỘT SỐ THUẬT TỐN THƠNG DỤNG
2.1 Thuật tốn sắp xếp đổi chỗ trực tiếp – Interchange sort:
2.1.1 Ý tưởng thuật tốn:
Giả sử ta có mảng A với n phần tử, bắt đầu từ phần tử đầu tiên của dãy, ta tìm tất cả
các nghịch thế chứa phần tử này rồi lần lượt triệt tiêu chúng bằng cách đổi chỗ phần tử
này với phần tử tương ứng trong cặp nghịch thế. Sau lần duyệt đầu tiên ta đưa được
phần tử nhỏ nhất (lớn nhất) về đầu dãy, sau đó tiếp tục duyệt từ phần tử ở vị trí thứ 2
trong lần sắp xếp tiếp theo. Lặp lại quá trình xử lý như trên với các phần tử còn lại trong
dãy, sau khi xử lý với phần tử thứ n-1 thì ta được một dãy đã sắp xếp.
2.1.2 Giải thuật Interchange sort:
Input: Mảng số nguyên A có n phần tử chưa được sắp xếp
Output: Mảng A đã được sắp xếp ( tăng or giảm dần )





Bước 1: Khởi tạo biến i với: i = 0; //phần tử đầu tiên của dãy
Bước 2: Khởi tạo biến j với: j = i + 1; // phần tử liền phần tử thứ i

Bước 3:

Vịng lặp với điều kiện (j < n) thì thực hiện:
+ Bước 3.1: So sánh nếu: (A[j] < A[i]) thì
Hốn vị A[j] với A[i] // TH sắp xếp tăng ( Nếu sắp xếp
giảm thì giữ ngun vị trí A[i] và A[j])
+ Bước 3.2: Tăng biến j: j = j + 1; //tăng j lên 1 để tìm nghịch thế mới


Bước 4: Tăng biến i: i = i + 1; //tăng i lên 1 để xét phần tử tiếp theo
So sánh (i < n - 1) thì: Quay lại Bước 2.
Ngược lại: Hết dãy, Dừng. //Đã sắp xếp xong
Lưu đồ:

1


BEGIN

i=0
A[i] > A[j]
S
i n -1
Int temp
Đ
= A[i]
A[i]
=
j=i+1

A[j]
-1
i+1
S
i=i+1

jĐ
S
A[i] >
A[j]

j=j+1
Đ

Int temp = A[i]
A[i] = A[j]
A[j] = temp

END

Hình 2.1 Lưu đồ thuật tốn sắp xếp đổi chỗ trực tiếp InterChange Sort

2


Ví dụ:

12


2

i=0

j=1

2

12

8

5

1

6

4

15

8

5

1

6


4

15

6

4

15

j=4

i=0

1

1

12

8

i=1

j=2

8

12


5

5

12

8

2

2

6

4

15

2

6

4

15

6

4


15

j=4

i=1

1

2

j=3

i=1

1

5

12

8

i=2

j=3

5

3



1

2

8

12

2

5

6

4

15

6

4

15

j=4

i=2

1


5

12

8

i=2

1

1

2

2

4

4

j=6

12

8

i=3

j=4


8

12

2

4

6

5

15

6

5

15

5

15

j=5

i=3

1


6

12

8

j=6

i=3

1

2

4

5

12

8

i=4

j=5

4

6


15


1

2

4

5

8

12

1

2

2

4

4

5

5


6

6

15

j=6

i=4

1

6

12

8

15

i=5

j=6

8

12

15


i=6

j=7

12

15

Kết quả
1

2

4

5

6

8

2.1.3 Cài đặt thuật toán Interchange sort:

void InterchangeSort-tang(int a[], int n)
{
for (int i = 0; i < n-1; i++)
for (int j = i+1; j < n; j++)
if (a[i] > a[j])
{
int temp = a[i];

a[i] = a[j];
a[j] = temp;
}
}

void InterchangeSort-giam(int a[], int n)
{
for (int i = 0; i < n-1; i++)
for (int j = i+1; j < n; j++)
if (a[i] < a[j])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}

Bảng 2.1 Cài đặt thuật toán sắp xếp Đổi chỗ trực tiếp bằng C/C++
5


2.1.4 Đánh giá thuật toán Interchange sort:

Bảng 2.2 Bảng đánh giá độ phức tạp của thuật toán Sắp xếp đổi chỗ trực tiếp
InterchangeSort là một thuật toán rất dễ hiểu và dễ sử dụng nhưng chưa có tính hiệu
quả của nó chưa cao
Số phép so sánh khơng đổi
Độ phức tập của Interchange sort sẽ là : O(n2)




TH tốt nhất là dãy ban đầu đã có thứ tự: khơng phải hốn vị
TH xấu nhất là dãy ban đầu có thứ tự ngược : số lần hoán vị là n(n-1)/2

2.2 Thuận toán sắp xếp chọn trực tiếp – Selection sort:
2.2.1 Ý tưởng thuật toán:
Thuật toán selection sort : sắp xếp bằng cách đi tìm phần tử có giá trị nhỏ nhất trong
danh sách các phần tử. Giả sử ta có mảng A có n phần tử. Chọn phần tử nhỏ nhất (lớn
nhất) trong n phần tử ban đầu, đưa phần tử này về vị trí đầu tiên của dãy. Xem dãy hiện
hành chỉ còn (n - 1) phần tử của dãy ban đầu, và bắt đầu từ phần tử ở vị trí thứ 2 trong
lần sắp xếp tiếp theo tiếp tục chọn phần tử nhỏ nhất (lớn nhất) và đưa về vị trí đầu dãy.
Lặp lại q trình trên dãy chỉ cịn một phần tử ta được mảng A sắp xếp tăng dần(giảm
dần).


Nói ngắn ngọn thì Selection sort chinh là thực hiện lần lượt n-1 lần việc đưa phần

tử nhỏ nhất trong dãy hiện hành về vị trí đúng ở đầu dãy.
2.2.2 Giải thuật Selection sort:
Input: Mảng số nguyên A có n phần tử chưa được sắp xếp
6


Output: Mảng A đã được sắp xếp tăng (giảm)dần
Sắp xếp tăng dần :



Bước 1: Khởi tạo biến i với: i = 0;
Bước 2: Tìm phần tử A[min] nhỏ nhất trong dãy hiện hành từ A[i] đến A[n - 1].

+ Bước 2.1: Gán biến min = i; //Giả sử phần tử A[i] có GTNN
+ Bước 2.2: Tìm giá trị nhỏ nhất trong đoạn [i + 1, n - 1].
 Khởi tạo biến j với: j = i + 1;
 Vòng lặp với điều kiện (j < n - 1) thì thực hiện:

So sánh (A[j] < A[min]) thì gán min = j; //vị trí min mới.



Bước 3: Hốn vị hai phần tử: A[min] và A[i]
Bước 4: Nếu (i < n - 1) thì
Tăng giá trị biến i: i ++; Quay lại Bước 2.
Ngược lại: Hết dãy, Dừng. //Đã sắp xếp xong

Lưu đồ :

7


Hình 2.2 Lưu đồ thuật tốn sắp xếp đổi chỗ chọn trực tiếp Selection Sort

8


Ví dụ minh họa:
5

6

2


10

31

1

5

6

2

10

31

1

6

2

10

31

5

6


10

31

5

10

31

6

31

10

i=0

min

1

i=1

min

1

2


i=2

min

1

2

5

i=3
min

1

2

5

6

i=4
min

9


Kết quả :
1


5

2

10

6

31

2.2.3 Cài đặt thuật toán Selection sort:
void Selectionsort-tang(int a[], int n)
{
int min;
for(int i=0; i{
min=i;
for(int j=i +1; jif(a[j]min=j;
if(min != i)
{ int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}

void Selectionsort-giam(int a[], int n)
{

int max;
for(int i=0; i{
max=i;
for(int j=i +1; jif(a[j]>a[max])
max=j;
if(max != i)
{ int temp = a[i];
a[i] = a[max];
a[max] = temp; }
}
}

Bảng 2.3 Cài đặt thuật toán Selection Sort bằng C/C++
2.2.4 Đánh giá thuật toán Selection sort:
Số phép so sánh:

=(

/2

Độ phức tạp của thuật toán: O( ) trong mọi trường hợp
Bộ nhớ sử dụng: O(1)

-

Ưu điểm
Đơn giản, dễ hiểu, dễ cài đặt, tốn ít


-

bộ nhớ máy tính
-

Nhược điểm
Thuật toán tốn thời gian gần như
bằng nhau đối với mảng đã được
sắp xếp hay chưa được sắp xếp.

Phù hợp với danh sách có ít dữ liệu
Có tính ổn định và tính thích ứng
với dữ liệu đầu vào
10

-

Độ phức tạp của thuật toán lớn, tốn
nhiều tài nguyên


-

Số lần hốn đổi vị trí ít

-

Thực hiện nhiều phép so sánh

Bảng 2.4 Ưu & Nhược điểm của thuật toán Selection Sort


11


×