Nộidung bài giảng
3.1 Giới thiệu chung
3
2
Mả à ả lý bộ hớ ₫ộ
3
.
2
Mả
ng v
à
qu
ả
n
lý
bộ
n
hớ
₫ộ
ng
3.3 Cài ₫ặt một số cấu trúc với C++
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
2
3.1 Giới thiệu chung
Phần lớn các bài toán trong thực tế liên quan tới các
dữ liệuphứchợpnhững kiểudữ liệucơ bảntrong
dữ
liệu
phức
hợp
,
những
kiểu
dữ
liệu
cơ
bản
trong
ngôn ngữ lập trình không ₫ủ biểu diễn
Ví dụ:
—
Dữ liệu sinh viên: Họ tên, ngày sinh, quê quán, mã số SV,
— Mô hình hàm truyền: Đa thức tử số, ₫a thức mẫu số
—
Mô hình trạng thái: Các ma trậnA,B,C,D
Mô
hình
trạng
thái:
Các
ma
trận
A,
B,
C,
D
— Đối tượng ₫ồ họa: Kích thước, màu sắc, ₫ường nét, phông
chữ,
Ph há biể diễ dữ liệ ₫ị hhĩ kiể dữ
Ph
ương p
há
p
biể
u
diễ
n
dữ
liệ
u:
₫ị
n
h
ng
hĩ
a
kiể
u
dữ
liệu mới sử dụng cấu trúc (struct, class, union, )
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
3
Vấn ₫ề: Biểu diễn tập hợp dữ liệu
Đa số những dữ liệu thuộc một ứng dụng có liên quan
với nhau => cần biểu diễn trong một tập hợp có cấu
trúc, ví dụ:
trúc,
ví
dụ:
— Danh sách sinh viên: Các dữ liệu sinh viên ₫ược sắp xếp theo
thứ tự Alphabet
Đốitượng ₫ồ họa: Mộtcửasổ bao gồm nhiều ₫ốitượng ₫ồ
—
Đối
tượng
₫ồ
họa:
Một
cửa
sổ
bao
gồm
nhiều
₫ối
tượng
₫ồ
họa, một bản vẽ cũng bao gồm nhiều ₫ối tượng ₫ồ họa
Thông thường, các dữ liệu trong một tập hợp có cùng
k ể h l hhkể h
k
i
ể
u,
h
oặc ít ra
l
à tương t
h
íc
h
k
i
ể
u với n
h
au
Kiểu mảng không phải bao giờ cũng phù hợp!
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
4
Vấn ₫ề: Quản lý dữ liệu
Sử dụng kết hợp một cách khéo léo kiểu cấu trúc và
kiểu mảng ₫ủ ₫ể biểu diễn các tập hợp dữ liệu bất kỳ
Các giải thuật (hàm) thao tác với dữ liệu, nhằm quản
lý dữ liệu một cách hiệu quả:
Bổ ột dữ liệ ớià ộtd h á h ộtbả
—
Bổ
sung m
ột
mục
dữ
liệ
u m
ới
v
à
o m
ột
d
an
h
s
á
c
h
, m
ột
bả
ng,
một tập hợp,
—Xóa một mục dữ liệu trong một danh sách, bảng, tập hợp,
—
Tìm một mục dữ liệu trong một danh sách, bảng tập hợp,
theo một tiêu chuẩn cụ thể
—Sắp xếp một danh sách theo một tiêu chuẩn nào ₫ó
—
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
5
Quản lý DL thế nào là hiệu quả?
Tiết kiệm bộ nhớ
Truy nhập nhanh, thuận tiện: Thời gian cần cho bổ
ế ắ
sung, tìm ki
ế
m và xóa bỏ các mục dữ liệu phải ng
ắ
n
Linh hoạt: Số lượng các mục dữ liệu không (hoặc ít)
bị hạnchế cố ₫ịnh không cầnbiếttrướckhitạocấu
bị
hạn
chế
cố
₫ịnh
,
không
cần
biết
trước
khi
tạo
cấu
trúc, phù hợp với cả bài toán nhỏ và lớn
Hiệu quả quản lý dữ liệu phụ thuộc vào
—Cấu trúc dữ liệu ₫ược sử dụng
—Giải thuật ₫ược áp dụng cho bổ sung, tìm kiếm, sắp xếp, xóa
bỏ
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
6
Các cấu trúc dữ liệu thông dụng
Mảng (nghĩa rộng): Tập hợp các dữ liệu có thể truy
nhập tùy ý theo chỉ số
Danh sách (list): Tậphợpcácdữ liệu ₫ược móc nối ₫ôi
Danh
sách
(list):
Tập
hợp
các
dữ
liệu
₫ược
móc
nối
₫ôi
một với nhau và có thể truy nhập tuần tự
Câ
y
(tree): T
ập
h
ợp
các dữ li
ệ
u ₫ư
ợ
c móc nối với nhau
y ập ợp ệ ợ
theo cấu trúc cây, có thể truy nhập tuần tự từ gốc
Hàng ₫ợi (queue): Tập hợp các dữ liệu có sắp xếp tuần
t hỉ bổ àtừ ột ₫ầ àlấ từ ₫ầ òli
t
ự, c
hỉ
bổ
sung v
à
o
từ
m
ột
₫ầ
u v
à
lấ
y ra
từ
₫ầ
u c
ò
n
l
ạ
i
Ngăn xếp (stack): Tập hợp các dữ liệu ₫ược sắp xếp
tuầntự,chỉ truy nhập ₫ượctừ một ₫ầu
tuần
tự,
chỉ
truy
nhập
₫ược
từ
một
₫ầu
Bộ nhớ vòng (ring buffer): Tương tự như hàng ₫ợi,
nhưng dung lượng có hạn, nếu hết chỗ sẽ ₫ược ghi
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
7
quay vòng
3.2 Mảng và quản lý bộ nhớ ₫ộng
Mảng cho phép biểu diễn và quản lý dữ liệu một cách
khá hiệuquả:
khá
hiệu
quả:
— Đọc và ghi dữ liệu rất nhanh qua chỉ số hoặc qua ₫ịa chỉ
—Tiết kiệm bộ nhớ
Các vấn ₫ề của mảng tĩnh:
VD: Student student_list[100];
Số phầntử phảilàhằng số (biếttrước khi biên dịch ngườisử
—
Số
phần
tử
phải
là
hằng
số
(biết
trước
khi
biên
dịch
,
người
sử
dụng không thể nhập số phần tử, không thể cho số phần từ
là một biến) => kém linh hoạt
Chiếmchỗ cứng trong ngănxếp(₫ốivớibiếncụcbộ)hoặc
—
Chiếm
chỗ
cứng
trong
ngăn
xếp
(₫ối
với
biến
cục
bộ)
hoặc
trong bộ nhớ dữ liệu chương trình (₫ối với biến toàn cục) =>
sử dụng bộ nhớ kém hiệu quả, kém linh hoạt
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
8
Mảng ₫ộng
Mảng ₫ộng là một mảng ₫ược cấp phát bộ nhớ theo
yêu cầu, trong khi chương trình chạy
#include <stdlib h>
/* C */
#include <stdlib
.
h>
/* C */
int n = 50;
float* p
1
(float*) malloc(n*sizeof(float)); /* C */
float* p
1
=
(float*) malloc(n*sizeof(float)); /* C */
double* p2= new double[n]; // C++
Sử dụng con trỏ ₫ể quản lý mảng ₫ộng: Cách sử dụng
không khác so với mảng tĩnh
p1[0] = 1.0;
p
2
[
0
]
= 2.0
;
p
[
]
;
Sau khi sử dụng xong => giải phóng bộ nhớ:
free(p1); /* C */
delete [] p
2
;
// C++
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
9
delete [] p
2
;
// C++
Cấp phát và giải phóng bộ nhớ ₫ộng
C:
—
Hàm malloc
()
y
êu cầu tham số là số b
y
te
,
trả về con trỏ
()
y
y
,
không kiểu (void*) mang ₫ịa chỉ vùng nhớ mới ₫ược cấp
phát (nằm trong heap), trả về 0 nếu không thành công.
—
Hàm free
()
y
êu cầu tham số là con trỏ khôn
g
kiểu (void*)
,
()
y g
,
giải phóng vùng nhớ có ₫ịa chỉ ₫ưa vào
C++:
Toán tử
new
chấpnhậnkiểudữ liệuphầntử kèm theo số
—
Toán
tử
new
chấp
nhận
kiểu
dữ
liệu
phần
tử
kèm
theo
số
lượng phần tử của mảng cần cấp phát bộ nhớ (trong vùng
heap), trả về con trỏ có kiểu, trả về 0 nếu không thành công.
Toán tử
delete[]
yêu cầuthamsố là con trỏ có kiểu
—
Toán
tử
delete[]
yêu
cầu
tham
số
là
con
trỏ
có
kiểu
.
—Toán tử new và delete còn có thể áp dụng cho cấp phát và
giải phóng bộ nhớ cho một biến ₫ơn, một ₫ối tượng chứ
không nhấtthiếtphảimộtmảng
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
10
không
nhất
thiết
phải
một
mảng
.
Một số ₫iều cần lưu ý
Con trỏ có vai trò quản lý mảng (₫ộng), chứ con trỏ không phải
là mảng (₫ộng)
Cấ hát bộ hớ àiảihó bộ hớ hứ khô hải ấ hát
Cấ
p p
hát
bộ
n
hớ
v
à
g
iải
p
hó
ng
bộ
n
hớ
c
hứ
khô
ng p
hải
c
ấ
p p
hát
con trỏ và giải phóng con trỏ
Chỉ giải phóng bộ nhớ một lần
Ví d
Ví
d
ụ:
int* p;
p[0] = 1; // ??
new(p);
// ??
new(p);
// ??
p = new int[100]; // OK
p[0] = 1; // OK
int*
p
2=
p;
//
OK
p
p;
//
delete[] p2; // OK
p[0] = 1; //??
delete[] p; //??
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
11
p = new int[50]; // OK, new array
Cấp phát bộ nhớ ₫ộng cho biến ₫ơn
Ý nghĩa: Các ₫ối tượng có thể ₫ược tạo ra ₫ộng, trong khi
chương trình chạy (bổ sung sinh viên vào danh sách, vẽ thêm
m
ộ
t hình tron
g
bản vẽ
,
bổ sun
g
m
ộ
t khâu tron
g
h
ệ
thốn
g,
)
ộ g , g ộ g ệ g,
Cú pháp
int* p = new int;
*
p
=
1;
p 1;
p[0]= 2; // giong nhu tren
p[1]= 1; // ??
int
*
p2
=
new int(1);
// có kh
ở
i t
ạ
o
int p2 new int(1);
// có kh
ở
i t
ạ
o
delete p;
delete p2;
Student
*
ps
=
new Student;
Student ps new Student;
ps->code = 1000;
delete ps;
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
12
delete ps;
Ý nghĩa của sử dụng bộ nhớ ₫ộng
Hiệu suất:
—Bộ nhớ ₫ược cấp phát ₫ủ dung lượng theo yêu cầu và khi
ầ
₫ược yêu c
ầ
u trong khi chương trình ₫ã chạy
—Bộ nhớ ₫ược cấp phát nằm trong vùng nhớ tự do còn lại của
máy tính (heap), chỉ phụ thuộc vào dung lượng bộ nhớ của
máy tính
máy
tính
—Bộ nhớ có thể ₫ược giải phóng khi không sử dụng tiếp.
Linh hoạt:
—
Thời gian "sống" của bộ nhớ ₫ược cấp phát ₫ộng có thể kéo
dài hơn thời gian "sống" của thực thể cấp phát nó.
—Có thể một hàm gọi lệnh cấp phát bộ nhớ, nhưng một hàm
khác giải phóng bộ nhớ
khác
giải
phóng
bộ
nhớ
.
—Sự linh hoạt cũng dễ dẫn ₫ến những lỗi "rò rỉ bộ nhớ".
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
13
Ví dụ sử dụng bộ nhớ ₫ộng trong hàm
Date* createDateList(int n) {
Date
*
p = new Date[n];
Date p = new Date[n];
return p;
}
void main() {
int n;
int n;
cout << "Enter the number of your national
holidays:";
cin >> n;
Date* date list = createDateList(n);
Date* date
_
list = createDateList(n);
for (int i=0; i < n; ++i) {
}
for ( ) { cout << }
for (
) { cout <<
}
delete [] date_list;
}
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
14
Các thuật toán trên mảng
Các thuật toán sắp xếp
Thuật toán tìm kiếm chia ₫ôi (tìm kiếm nhị phân)
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
15
Các thuật toán sắp xếp trên mảng
Các giải thuật sắp xếp cơ bản
—Sắp xếp chọn (selection-sort)
Sắ ế ổ b (b bbl h
)
—
Sắ
p x
ế
p n
ổ
i
b
ọt
(b
u
bbl
e, exc
h
ange-sort
)
—Sắp xếp chèn (insertion-sort)
Các giảithuậtsắpxếp nâng cao
-
Sắpxếp nhanh
Các
giải
thuật
sắp
xếp
nâng
cao
Sắp
xếp
nhanh
—Sắp xếp nhanh (quick-sort)
—Sắp xếp vun ₫ống (heap-sort)
Sắ ế hò t ộ (
t)
—
Sắ
p x
ế
p
hò
a
t
r
ộ
n
(
merge-sor
t)
Quy ước:
—
Giả sử các
p
hần tử khóa cần sắ
p
xế
p
là các số
p p p
—Sắp xếp thực hiện theo thứ tự từ nhỏ ₫ến lớn
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
16
Sắp xếp chọn ( selection-sort )
Nguyên tắc
—Lượt 1: tìm khóa nhỏ nhất trong n khóa ₫ưa lên vị trí thứ
nhất (₫ổi chỗ với khóa ₫ầu tiên)
—
Lượt 2: tìm khóa nhỏ nhất trong n-1 khoá còn lại ₫ưa lên vị
trí thứ 2 (₫ổi chỗ với khóa thứ 2)
—
L t i tì khó hỏ hấtt (
i
1
)kh á ò l i ₫ lê
—
L
ượ
t
i
:
tì
m
khó
a n
hỏ
n
hất
t
rong
(
n-
i
+
1
)
kh
o
á
c
ò
n
l
ạ
i
₫
ưa
lê
n
vị trí thứ i (₫ổi chỗ với khóa thứ i)
Ví dụ:
Sắ ế
—
Sắ
p x
ế
p:
25, 36, 31, 49, 16, 70, 88, 60
16, 36, 31, 49,
25
, 70, 88, 60
16
25
31
49
36
70
88
60
16
,
25
,
31
,
49
,
36
,
70
,
88
,
60
16, 25, 31, 49, 36, 70, 88, 60
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
17
Sắp xếp chèn ( Insertion-sort )
Nguyên tắc
—Giả sử ₫oạn ₫ầu ₫ã ₫ược sắp xếp, thêm một khóa mới => tìm vị trí
thích hợp cho khóa mới. Cứ làm như vậy từ 2 ₫ến n khóa.
So sánh và sắpxếpdầntừ ₫ằng sau danh sách khóa
—
So
sánh
và
sắp
xếp
dần
từ
₫ằng
sau
danh
sách
khóa
.
Phân biệt hai trường hợp
—Trường hợp cần ₫ưa lần lượt các khóa vào: nhập các khóa lần lượt
vào các ô nhớ. Dãy khóa:
25
,
36
,
31
,
49
,
16
,
70
,
88
,
60
vào
các
ô
nhớ.
Dãy
khóa:
25
,
36
,
31
,
49
,
16
,
70
,
88
,
60
1: 25 4: 25, 31, 36, 49
2: 25, 36 5: 16, 25, 31, 36, 49
3
:
25
31
36
6
:
3
:
25
,
31
,
36
6
:
—Trường hợp các khóa ₫ã có và cần sắp xếp lại: dùng ô nhớ phụ
(biến) X ₫ể lưu tạm các giá trị cần dịch chuyển. Hướng dịch chuyển:
dần về ₫ầu.
1
25
36
31
49
16
70
88
60
4
25
31
36
49
16
70
88
60
—
1
:
25
,
36
,
31
,
49
,
16
,
70
,
88
,
60
4
:
25
,
31
,
36
,
49
,
16
,
70
,
88
,
60
—2: 25, 36, 31, 49, 16, 70, 88, 60 5: 16, 25, 31, 36, 49, 70, 88, 60
—3: 25, 31, 36, 49, 16, 70, 88, 60 6:
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
18
Sắp xếp nổi bọt (Bubble-sort)
Nguyên tắc
—Duyệt bảng khoá (danh sách khoá) từ ₫áy lên ₫ỉnh
—
Dọc ₫ường nếu thứ tự 2 khoá liền kế không ₫úng => ₫ổi chỗ
Ví dụ:
—
1: 25, 36, 31, 60, 16, 88, 49, 70
—2: 16, 25, 36, 31, 60, 49, 88, 70
—
3: 16, 25, 31, 36, 49, 60, 70, 88
Nhận xét
— Khoá nhỏ sẽ nổi dần lên sau mỗi lần duyệt =>
“nổi bọt”
—
Sau một vài lần (không cần chạy n bước), danh sách khoá ₫ã
có thể ₫ược sắp xếp => Có thể cải tiến thuật toán, dùng 1
biến lưu trạng thái, nếu không còn gì thay ₫ổi (không cần ₫ổi
hỗ)
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
c
hỗ)
=> ngừng
19
Sắp xếp nhanh (quick-sort) hay Sắp xếp phân ₫oạn
Nguyên tắc
—Chiến lược chia ₫ể trị
—Chọn mốc (bất kỳ) ₫ể phân thành từng ₫oạn (partition) (2 ₫oạn)
Kh á ủ ố ẽ ₫ứ ggiữ LftK < k ( ố )< RightK
—
Kh
o
á
c
ủ
a m
ố
c s
ẽ
₫ứ
n
g
giữ
a:
L
e
ft
K
eys
<
=
k
ey
(
m
ố
c
)
<
=
Right
K
eys
Thuật toán
— 1: Quy ước: luôn chọn phần tử ₫ầu tiên làm mốc.
—2: Tìm v
ị
trí th
ự
c của khóa mốc ₫ể
p
hân thành 2 ₫o
ạ
n:
ị ự p
ạ
z 1: Dùng 2 chỉ số: i, j chạy từ hai ₫ầu DS. Chạy i từ ₫ầu
DS trong khi khóa còn nhỏ hơn khóa mốc
z 2: Nếu khóa >= khóa mốc: chạy j. Lưu phần tử hiện tại =
X
z 3: Chạy j trong khi khóa lớn hơn khóa mốc
z 4: Nếu khóa <= khóa mốc: dừng và ₫ổi chỗ phần tử hiện
t ihX
t
ạ
i
c
h
o
X
z 5: Tiếp tục thực hiện như vậy cho ₫ến khi i>=j thì ₫ổi chỗ
Kj cho khóa mốc. Lúc ₫ó khóa mốc sẽ nằm ₫úng vị trí.
3
:Làmgiống như vậychocác₫oạntiếptheo
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
—
3
:
Làm
giống
như
vậy
cho
các
₫oạn
tiếp
theo
20
Sắp xếp nhanh ( )
Ví dụ:
0
25
36
31
49
16
70
88
60
—
0
:
25
,
36
,
31
,
49
,
16
,
70
,
88
,
60
— 1.1: 25, 36, 31, 49, 16, 70, 88, 60
— 1.2: 25
,
1
6
,
31
,
49
,
3
6
,
70
,
88
,
60
,
,
,
,
,
,
,
— 1.3: (16), 25, (31, 49, 36, 70, 88, 60)
— 2.1: (16)
—
3
1
:
31
49
36
70
88
60
—
3
.
1
:
31
,
49
,
36
,
70
,
88
,
60
— 3.2:
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
21
Sắp xếp nhanh ( )
Nhận xét
Vấ ₫ề h ố
—
Vấ
n
₫ề
c
h
ọn m
ố
c:
z Nếu luôn chọn mốc có giá trị khóa = min => một
lần chỉ chu
y
ển ₫ư
ợ
c 1
p
hần tử:
g
iốn
g
bubble-
y ợ
p g g
sorting
z Nếu mốc có giá trị khóa trung bình => chia
₫ là
2
₫ ó ₫ộ dài t ₫
₫
ược
là
m
2
₫
oạn c
ó
₫ộ
dài
t
ương
₫
ương.
—Vấn ₫ề phối hợp với các giải thuật ₫ơn giản khác:
z Giải thu
ậ
t tươn
g
₫ối
p
hức t
ạp
=> khi các ₫o
ạ
n
ậ g p ạp ạ
cần sắp xếp ₫ủ nhỏ, ta phối hợp với các giải
thuật sắp xếp ₫ơn giản ₫ã nêu trên.
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
22
Sắp xếp vun ₫ống (heap-sort)
Nguyên tắc
— Dùng cấu trúc cây NP hoàn chỉnh lưu trữ các khóa bằng CTLT
tuần t
ự
ự
(Cây NP hoàn chỉnh là cây nhị phân mà tất cả các nút ở chiều cao h-1
₫ều có 2 con, các nút có chiều cao h thì dồn về bên trái)
— Khái niệm
"₫ống"
(heap):
z là cây nhị phân hoàn chỉnh
z luôn có: key(parent) >= key(child)
—
Các giai ₫oạn:
Các
giai
₫oạn:
z Biến ₫ổi cây NP thành
"₫ống"
(heap)
— Lá = heap
Vun lá thành ₫ống (bottom
up)
—
Vun
lá
thành
₫ống
(bottom
-
up)
z Sắp xếp các khóa:
— Tìm khóa lớn nhất, ₫ưa ra ngoài
Vlithà h
"₫ố g"
(h ) ₫ối ớiâ ò li
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
—
V
un
l
ạ
i
thà
n
h
"₫ố
n
g"
(h
eap
)
₫ối
v
ới
c
â
y c
ò
n
l
ạ
i
23
Sắp xếp vun ₫ống ( )
Ví dụ
— 0: 25, 36, 31, 49, 16, 70, 88, 60
—1: Tạo cây NP
2
V ₫ố từ lá
—
2
:
V
un
₫ố
ng
từ
lá
—3: Lấy ra số max, tráo với phần tử hiện tại
—
4
:Sắplại cây thành heap
—
4
:
Sắp
lại
cây
thành
heap
.
—5: Lặp lại bước 3, 4 cho ₫ến hết.
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
24
Sắp xếp trộn (merge-sort)
Nguyên tắc
1
hầ tử (lá) i h là ₫ã ₫ ắ ế
—
1
p
hầ
n
tử
(lá)
co
i
n
h
ư
là
₫ã
₫
ược s
ắ
p x
ế
p
—L1 ₫ược sắp xếp
—L2 ₫ược sắp xếp
—
Trộn L1, L2 => L
Ví dụ
25
36
31
49
16
70
88
60
—
25
,
36
,
31
,
49
,
16
,
70
,
88
,
60
— 1: [25], [36], [31], [49], [16], [70], [88], [60]
— 2: [25, 36], [31, 49], [16, 70], [60, 88]
—
3: [25, 31, 36, 49], [16, 60, 70, 88]
— 4: [16, 31, 36, 49, 60, 70, 88]
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
25
Nhận xét các giải thuật sắp xếp
Các giải thuật sắp xếp ₫ơn giản
—Sắp xếp chọn (selection-sort):
T
T
T
T(n) O(n
2
)
z
T
min
=
T
max
=
T
tb
=
T(n)
=
O(n
2
)
—Sắp xếp chèn (insertion-sort)
z T
min
= O(n) ; T
max
= O(n
2
); T
tb
= O(n
2
)
—
Sắp xếp nổi bọt (bubble, exchange-sort)
z T
min
= T
max
= T
tb
= T(n) = O(n
2
)
Các giảithuậtsắpxếp nâng cao
Các
giải
thuật
sắp
xếp
nâng
cao
—Sắp xếp nhanh (quick-sort)
z T
max
= O(n
2
) ; T
tb
= O(n logn)
Sắ ế ₫ố (h
)
—
Sắ
p x
ế
p vun
₫ố
ng
(h
eap-sort
)
z T
max
= T
tb
= O(n logn)
—Sắp xếp hòa trộn (merge-sort)
Chương 3: Cấu trúc dữ liệu
© 2010 - KimThoa
z T
max
= T
tb
= O(n logn)
26