Tải bản đầy đủ (.pdf) (69 trang)

BÁO cáo CUỐI kỳ TỔNG hợp môn cấu TRÚC dữ LIỆU và GIẢI THUẬT

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 (425.37 KB, 69 trang )

TỔNG LIÊN ĐỒN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG
KHOA CƠNG NGHỆ THƠNG TIN

ĐỒ ÁN CUỐI KÌ
MƠN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

BÁO CÁO CUỐI KỲ TỔNG HỢP MÔN CẤU
TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Người hướng dẫn: TS VÕ HỒNG QN
Người thực hiện: NGUYỄN DUY ĐƠNG – 52000749
Lớp

:

20050301

Khố

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2022

:

24


TỔNG LIÊN ĐỒN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG
KHOA CƠNG NGHỆ THƠNG TIN


ĐỒ ÁN CUỐI KÌ
MƠN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

BÁO CÁO CUỐI KỲ TỔNG HỢP MÔN CẤU
TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Người hướng dẫn: TS VÕ HỒNG QN
Người thực hiện: NGUYỄN DUY ĐƠNG – 52000749
Lớp

:

20050301

Khố

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2022

:

24


i

LỜI CẢM ƠN
Em xin chân thành cảm ơn thầy Võ Hoàng Quân đã đồng hành và giúp đỡ em trong học kí vừa
qua, cũng như nhờ thầy mà em có thể tiếp thu và hiểu được môn học Cấu trúc dữ liệu và giải
thuật. Lần nữa, em xin chân thành cảm ơn.



ii

ĐỒ ÁN ĐƯỢC HỒN THÀNH
TẠI TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi và được sự hướng dẫn của
TS Võ Hoàng Quân;. Các nội dung nghiên cứu, kết quả trong đề tài này là trung thực
và chưa công bố dưới bất kỳ hình thức nào trước đây. Những số liệu trong các bảng
biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu thập từ các
nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo.
Ngồi ra, trong đồ án cịn sử dụng một số nhận xét, đánh giá cũng như số liệu
của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.
Nếu phát hiện có bất kỳ sự gian lận nào tơi xin hồn tồn chịu trách nhiệm
về nội dung đồ án của mình. Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong q trình thực hiện (nếu có).

TP. Hồ Chí Minh, ngày 10 tháng 1 năm 2022
Tác giả
(ký tên và ghi rõ họ tên)
Đông
Nguyễn Duy Đông


iii

PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn

_________________________________________________________
_________________________________________________________

_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
Tp. Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)

Phần đánh giá của GV chấm bài

_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
Tp. Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)


iv

TÓM TẮT

BÁO CÁO GỒM CÓ HAI PHẦN:
PHẦN 1: ĐỀ BÀI
PHẦN 2: PHÂN TÍCH VÀ GIẢI QUYẾT YÊU CẦU



1

MỤC LỤC
DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT................................................................3
DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ..................................................4
PHẦN 1 – ĐỀ BÀI.........................................................................................................5
I. Đệ Quy.............................................................................................................5
II. Sắp xếp............................................................................................................ 5
III. Stack..............................................................................................................5
IV. Cấu trúc dữ liệu Danh sách và Cây................................................................6
V. Đồ thị..............................................................................................................6
PHẦN 2 - PHÂN TÍCH VÀ GIẢI QUYẾT YÊU CẦU.................................................8
I. Đệ quy..............................................................................................................8
1.1 Lý thuyết.............................................................................................8
1.2 Thực hành.........................................................................................17
II. Sắp xếp.......................................................................................................... 18
2.1 Khởi tạo mảng gồm 10 phần tử:........................................................18
III. Stack............................................................................................................29
3.1

Chuyển đổi biểu thức trung tố (Infix) sang hậu tố (postfix).........29

3.2 Tính biểu thức hậu tố (postfix).........................................................31
IV. Cấu trúc dữ liệu Danh sách và Cây..............................................................32
4.1

Lý thuyết......................................................................................32

4.2


Thực hành....................................................................................34
4.2.1 Cài đặt code bằng Linked List............................................34
4.2.2 Cài đặt code bằng cây AVL................................................39

V. Đồ thị............................................................................................................48
5.1 Lý thuyết...........................................................................................48
5.1.1 Đồ thị người dùng...............................................................48
5.1.2 Duyệt đồ thị........................................................................48


2

5.2

Thực hành....................................................................................55

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


3

DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT


4

DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ


5


PHẦN 1 – ĐỀ BÀI
I. Đệ Quy
a. (0.5 điểm – Lý thuyết) Chọn mỗi nhóm 01 bài tốn và giải thích tính
đệ quy (diễn giải, vẽ cây đệ quy với một ví dụ gồm ít nhất 5 lần gọi đệ
quy):
i. Nhóm 1:
• Giải bài tốn xy
• Giải bài tốn tính tổng các chữ số của một số nguyên dương gồm
𝑛 chữ số.
ii. Nhóm 2:
• Giải bài tốn tính số fibonacci thứ 𝑛.
• Giải bài tốn tính tổ hợp chập 𝑘 của 𝑛 phần tử. • Giải bài tốn
tìm số lớn nhất trong một mảng.
b. (0.5 điểm – Thực hành) Tạo một lớp bất kỳ để định nghĩa code bằng
đệ quy cho 02 ví dụ đã chọn bên trên và tạo phương thức main() để
kiểm tra lại kết quả.

II. Sắp xếp
Sinh viên tự cho một mảng số nguyên gồm 10 phần tử (thứ tự của phần
tử phải là ngẫu nhiên, không được nằm trong các trường hợp mảng đã
có thứ tự sẵn hoặc một phần mảng đã có thứ tự)
a. (0.5 điểm – Lý thuyết) Cho ví dụ chạy từng bước việc sắp xếp
mảng dùng 02 trong 03 giải thuật Bubble Sort, Insertion Sort hoặc
Selection Sort. (Sinh viên lưu ý phải thể hiện rõ sự thay đổi của các phần
tử trong mảng qua từng bước).
b. (0.5 điểm – Lý thuyết) Cho ví dụ chạy từng bước việc sắp xếp
mảng dùng 01 trong 02 giải thuật Merge Sort hoặc Quick Sort. (Sinh
viên lưu ý phải thể hiện rõ sự thay đổi của các phần tử trong mảng qua
từng bước).


III. Stack

a) (1 điểm – Lý thuyết) Trình bày giải thuật sử dụng Stack để tạo biểu
thức Ba Lan ngược (Reverse Polish notation – RPN). Giải thuật này
chuyển một biểu thức từ dạng trung tố (infix) sang dạng hậu tố (postfix).
Cho ví dụ một biểu thức infix gồm ít nhất 6 phép tốn (có đủ phép cộng
(+), trừ (-), nhân (*) và chia (/)) và chứa ít nhất 2 cặp ngoặc, áp dụng
giải thuật để chuyển biểu thức này thành dạng postfix.


6

b) (1 điểm – Lý thuyết) Trình bày giải thuật sử dụng Stack để tính kết
quả từ biểu thức postfix. Áp dụng giải thuật tính tốn biểu thức postfix
tại câu a).

IV. Cấu trúc dữ liệu Danh sách và Cây
Lý thuyết (1.5 điểm):
Phân tích bài tốn quản lý sinh viên bằng Mảng (Array), Linked List và
bằng cây AVL. Nêu ưu điểm và nhược điểm, so sánh hiệu suất của các
cấu trúc dữ liệu trên các thao tác:
a) (0.25 điểm) Thêm một sinh viên mới
b) (0.25 điểm) Xóa sinh viên
c) (0.25 điểm) Tìm kiếm sinh viên
Thực hành (1.5 điểm):
Cài đặt bài tốn trên bằng Linked List (không sử dụng thư viện) và
bằng cây AVL với dữ liệu tự cho. Tối thiếu 15 đối tượng sinh viên. Mỗi
đối tượng sinh viên có các thuộc tính: mã số sinh viên (mã 8 ký tự, ký tự
đầu có thể là chữ cái), họ tên sinh viên, điểm trung bình tích lũy và 2

thuộc tính khác sinh viên tự cho thêm. Hiện thực phương thức cho các
thao tác sau trên cả hai cấu trúc dữ liệu. (cây AVL lưu trữ theo mã số
sinh viên)
a) (0.25 điểm) Hiện thực thao tác thêm một sinh viên mới.
b) (0.25 điểm) Hiện thực thao tác xóa một sinh viên.
c) (0.25 điểm) Hiện thực thao tác tìm kiếm thơng tin theo mã số sinh
viên.

V. Đồ thị
Xây dựng đồ thị biểu diễn người dùng của một mạng xã hội mỗi người
dùng gồm các thông tin sau mã người dùng, tên người dùng, số tuổi, giới
tính, nghề nghiệp.
Lý thuyết (1.5 điểm):
a) (0.25 điểm) Vẽ đồ thị trên với ký hiệu đỉnh là mã người dùng, mỗi
người dùng có kết bạn với nhau sẽ được biểu diễn bằng cạnh nối giữa
hai đỉnh người dùng. Đồ thị gồm ít nhất 30 đỉnh và 50 cạnh. Đồ thị có
thể chứa một vài đỉnh cơ lập.
b) (0.5 điểm) Viết kết quả duyệt đồ thị bằng giải thuật BFS và DFS bắt
đầu từ một đỉnh sinh viên tự chọn.
Thực hành (1.5 điểm):
a) (0.25 điểm) Sinh viên tự cho file text, đọc file và biểu diễn đồ thị trên
(có thể dùng ma trận kề, danh sách kề, danh sách cạnh).


7

b) (0.25 điểm) Viết phương thức trả về danh sách bạn bè của một người
dùng truyền vào.
c) (0.25 điểm) Viết phương thức xác định hai tài khoản truyền vào có
bao nhiêu bạn chung.



8

PHẦN 2 - PHÂN TÍCH VÀ GIẢI QUYẾT YÊU CẦU
I. Đệ quy
1.1 Lý thuyết
a) Tính S(x, y) = xy.
Lũy thừa bật 0 của một số bất kỳ thì bằng 1. Áp dụng điều này ta có được
điều kiện dừng của chương trình đệ quy là:
if (y == 0)
return 1;
Tùy theo giá trị của y mà biểu thức đệ quy có thể khác nhau. Các trường hợp
có thể xảy ra đối với y:
 Trường hợp 1: y > 0
Lúc này xy = x*x*x*…*x (y lần).
Biểu thức đệ quy lúc này sẽ là:
x*S(x, y-1).
 Trường hợp 2: y < 0
1
∗1
x
1
∗1
Lúc này xy = x-y = y = x
∗…∗1 (y lần).
x
x
x
1.0

Biểu thức đệ quy:
*S(x, y + 1).
x

Ví dụ 1: Tính S(2,5).

Giải:

Kết quả chạy của chương trình sẽ được biểu diễn ở cây đệ quy sau:


9

S(2, 5)

2*S(2, 4) = 2 * 16 = 32

S(2, 4)

2*S(2, 3) = 2 * 8 = 16

S(2, 3)

2*S(2, 2) = 2 * 4 = 8

S(2, 2)

2*S(2,1) = 2 * 2 = 4

S(2, 1)


2*S(2,0) = 2*1 = 2

S(2,0)

1

Trình tự thực hiện như sau:
 Đệ quy lần 1:
int S(int 2, int 5) //(int x, int y){
if (5 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // true
return 2*S(2,4); // Gọi đệ quy
if (y < 0) // false
return
}

1.0
*S(x, y + 1); //không thực hiện lệnh return
x

 Đệ quy lần 2:
int S(int 2, int 4) //(int x, int y){
if (4 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // true
return 2*S(2,3); // Gọi đệ quy
if (y < 0) // false
return

}

1.0
*S(x, y + 1); //không thực hiện lệnh return
x

 Đệ quy lần 3:
int S(int 2, int 3) //(int x, int y){
if (3 == 0) // false


10

return 1; //không thực hiện lệnh return trong if
if (y > 0) // true
return 2*S(2,2); // Gọi đệ quy
if (y < 0) // false
return
}

1.0
*S(x, y + 1); //không thực hiện lệnh return
x

 Đệ quy lần 4:
int S(int 2, int 2) //(int x, int y){
if (2 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // true
return 2*S(2,1); // Gọi đệ quy

if (y < 0) // false
return
}

1.0
*S(x, y + 1); //không thực hiện lệnh return
x

 Đệ quy lần 5:
int S(int 2, int 1) //(int x, int y){
if (1 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // true
return 2*S(2,0); // Gọi đệ quy
if (y < 0) // false
return
}

1.0
*S(x, y + 1); //không thực hiện lệnh return
x

 Đệ quy lần 6:
int S(int 2, int 0) //(int x, int y){
if (0 == 0) // true
return 1; // thực hiện lệnh return


11


//Không thực hiện các lệnh bên dưới
if (y > 0) // false
return 2*S(2,0); // Gọi đệ quy
if (y < 0) // false
return
}

1.0
*S(x, y + 1); //không thực hiện lệnh return
x

 Sau khi chương trình gặp điều kiện dừng tại lần gọi đệ quy thứ 6, kết
quả của phép toán như sau:
 S(2,0) = 1
 S(2,1) = 2*S(2,0) = 2*1 = 2
 S(2,2) = 2*S(2,1) = 2*2 = 4
 S(2,3) = 2*S(2,2) = 2*4 = 8
 S(2,4) = 2*S(2,3) = 2*8 = 16
 S(2,5) = 2*S(2,4) = 2*16 = 32
Ví dụ 2: Tính S(2,-5)

Giải:
Kết quả của chương trình được biểu diễn ở cây đệ quy sau:
S(2, -5)

*S(2, -4) = * =

S(2, -4)

*S(2, -3) = * =


S(2, -3)

*S(2, -2) = * =

S(2, -2)

*S(2,-1 ) = * =

S(2, -1)

*S(2,0) = *1 =

S(2,0)

Trình tự thực hiện như sau:
 Đệ quy lần 1:
int S(int 2, int -5) //(int x, int y){
if (5 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // fasle

1


12

return 2*S(x, y-1); //không thực hiện lệnh return trong if
if (y < 0) // true
return

}

1.0
*S(2, -4); //Gọi đệ quy
x

 Đệ quy lần 2:
int S(int 2, int -4) //(int x, int y){
if (-4 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
return
}

1.0
*S(2, -3); //Gọi đệ quy
x

 Đệ quy lần 3:
int S(int 2, int -3) //(int x, int y){
if (-2 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
return
}


1.0
*S(2, -2); //Gọi đệ quy
x

 Đệ quy lần 4:
int S(int 2, int -2) //(int x, int y){
if (-2 == 0) // false
return 1; //không thực hiện lệnh return trong if


13

if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
return
}

1.0
*S(2, -1); //Gọi đệ quy
x

 Đệ quy lần 5:
int S(int 2, int -1) //(int x, int y){
if (-1 == 0) // false
return 1; //không thực hiện lệnh return trong if
if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
return

}

1.0
*S(2, 0); //Gọi đệ quy
x

 Đệ quy lần 6:
int S(int 2, int 0) //(int x, int y){
if (0 == 0) // true
return 1; //thực hiện lệnh return
//Không thực hiện các lệnh bên dưới
if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // false
return
}

1.0
*S(x, y + 1); //Không thực hiện lệnh return
x

 Sau khi chương trình gặp điều kiện dừng tại lần gọi đệ quy thứ 6, kết
quả của phép toán như sau:
 S(2,0) = 1


14

1


1

1

 S(2,1) = 2 *S(2,0) = 2 *1 = 2
1
2
1
S(2,3) = *S(2,2) =
2
1
S(2,4) = *S(2,3) =
2
1
S(2,5) = *S(2,4) =
2

1 1 1
2 2 4
1 1 1
* =
2 4 8
1 1
1
* =
2 8 16
1 1
1
* =
2 16 32


 S(2,2) = *S(2,1) = * =




b) Tính C(n,k) = C kn
Tính chất của tổ hơp:
 C 0n = C nn = 1
 C 1n = n
k
k
 C k−1
n−1 + C n−1 = C n
Dựa vào các tính chất trên ta thấy:
 Khi:
o k = 0 hoặc k = n thì C kn = 1
if (k == 0 || k == n)
return 1;
k
o k = 1 thì C n = n
if (k == 1)
return n;
 Tính dừng của đệ quy
 Biểu thức đệ quy:
C(n-1, k) + C(n-1, k-1)
Ví dụ: Tính C(5,4)

Giải:
Kết quả chạy của chương trình được biểu diễn ở cây đệ quy sau:

return

return

1

5

C(5,4)
return

C(4,4)

4

C(4,3)
return

1

C(3,3)

return

3

C(3,2)


15


Trình tự thực hiện của chương trình như sau:
int C(5,4) // (int n, int k) {
if (4 == 0 || 4 == 5) // (k == 0 || k == n)  false
return 1;
không thực thi if
if (4 == 1) // (k == 1)  false
return 5; // return n
không thực thi if
return C(4,4) + C(4,3); // C(n-1, k) + C(n-1, k-1)
//Gọi đệ quy
}
int C(4,4) // (int n, int k) {
if (4 == 0 || 4 == 4) // (k == 0 || k == n)  true
return 1;
thực thi if
if (4 == 1) // (k == 1)  false
return 4; // return n
không thực thi if
return C(n-1, k) + C(n-1, k-1)
//Không thực hiện gọi đệ quy
}
int C(4,3) // (int n, int k) {
if (3 == 0 || 3 == 4) // (k == 0 || k == n)  false
return 1;


16

}


không thực thi if
if (3 == 1) // (k == 1)  false
return 4; // return n
không thực thi if
return C(3,3) + C(3,2); // C(n-1, k) + C(n-1, k-1)
//Gọi đệ quy

int C(3,3) // (int n, int k) {
if (3 == 0 || 3 == 3) // (k == 0 || k == n)  true
return 1;
thực thi if
if (3 == 1) // (k == 1)  false
return 3; // return n
không thực thi if
return C(n-1, k) + C(n-1, k-1)
//không thực hiện gọi đệ quy
}
int C(3,2) // (int n, int k) {
if (2 == 0 || 2 == 3) // (k == 0 || k == n)  false
return 1;
không thực thi if
if (2 == 1) // (k == 1)  false
return 3; // return n
không thực thi if
return C(2,2) + C(2,1); // C(n-1, k) + C(n-1, k-1)
//Gọi đệ quy
}
int C(2,2) // (int n, int k) {
if (2 == 0 || 2 == 2) // (k == 0 || k == n)  true

return 1;


17

}

thực thi if
if (2 == 1) // (k == 1)  false
return 2; // return n
không thực thi if
return C(n-1, k) + C(n-1, k-1)
//không thực hiện gọi đệ quy

int C(2,1) // (int n, int k) {
if (1 == 0 || 1 == 2) // (k == 0 || k == n)  false
return 1;
không thực thi if
if (1 == 1) // (k == 1)  true
return 2; // return n
thực thi if
return C(n-1, k) + C(n-1, k-1)
//không thực hiện gọi đệ quy
}
Kết quả của chương trình như sau:
 C(2,1) = 2
 C(2,2) = 1
 C(3,2) = C(2,1) + C(2,2) = 3
 C(3,3) = 1
 C(4,3) = C(3,3) + C(3,2) = 3 + 1 = 4

 C(4,4) = 1
 C(5,4) = C(4,4) + C(4,3) = 3 + 1 = 5

1.2 Thực hành
public class Cau1 {
public static double Xy(int x, int y) {


18

if (y == 0) return 1;
if (y > 0)
return x*Xy(x, y-1);
else
return (1.0/x)*Xy(x, y+1);
}

public static int C(int n, int k) {
if (k == 0 || k == n) return 1;
if (k == n) return n;
return C(n-1, k) + C(n-1, k-1);
}
public static void main(String[] args) {
System.out.println("2^5 = " + (int)Xy(2,5));
System.out.println("2^(-5) = " + Xy(2,-5));
System.out.println("To ho chap 4 cua 6 phan tu 6C4 = " +
C(6,4));
}
}


II. Sắp xếp
2.1 Khởi tạo mảng gồm 10 phần tử:
10

5

a)
 Selection Sort

1

13

20

4

6

9

2

14


19

Xuất phát từ đầu (hoặc cuối) mảng, ta đưa phần tử nhỏ (hoặc lớn) nhất về vị trí
đầu tiên (hoặc cuối cùng) của mảng và không xét đến phần tử đó nữa. Lúc này

mảng chỉ cịn lại n-1 phần tử của mảng ban đầu, ta tiếp tục xét phần tử thứ hai
của mảng.
Các bước thực hiện như sau:
- Màu vàng biểu thị cho số nhỏ nhất tìm được.
- Màu cam biểu thị cho phần tử cần đổi chỗ.
- Màu xanh biểu thị cho dãy đã sắp xếp.
Bước 1: Tìm phần tử nhỏ nhất từ a[0] tới a[9] và đổi chỗ nó với a[0]. Ở đây, ta
thấy a[2] = 1 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[0].
10
5
1
13
20
4
6
9
2
14
Bước 2: Tìm phần tử nhỏ nhất từ a[1] tới a[9] và đổi chỗ nó với a[1]. Ở đây, ta
thấy a[8] = 2 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[1].
1
5
10
13
20
4
6
9
2
14

Bước 3: Tìm phần tử nhỏ nhất từ a[2] tới a[9] và đổi chỗ nó với a[2]. Ở đây, ta
thấy a[5] = 4 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[2].
1
2
10
13
20
4
6
9
5
14
Bước 4: Tìm phần tử nhỏ nhất từ a[3] tới a[9] và đổi chỗ nó với a[3]. Ở đây, ta
thấy a[8] = 5 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[3].
1
2
4
13
20
10
6
9
5
14
Bước 5: Tìm phần tử nhỏ nhất từ a[4] tới a[9] và đổi chỗ nó với a[4]. Ở đây, ta
thấy a[6] = 6 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[4].
1
2
4
5

20
10
6
9
13
14
Bước 6: Tìm phần tử nhỏ nhất từ a[5] tới a[9] và đổi chỗ nó với a[5]. Ở đây, ta
thấy a[7] = 9 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[5].
9
1
2
4
5
6
10
20
13
14
Bước 7: Tìm phần tử nhỏ nhất từ a[6] tới a[9] và đổi chỗ nó với a[6]. Ở đây, ta
thấy a[7] = 10 là phần tử nhỏ nhất, tiến hành đổi chỗ với a[6].


×