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

Chapter3 Mảng và quản lý bộ nhớ động c++

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 (470.2 KB, 64 trang )

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


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



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



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

p
biể
u
diễ

n
dữ

liệ
u:
₫ị
n
h
ng

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,



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



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ố



con

trỏ



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

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



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

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
:

m
khó
a n
hỏ
n
hất

t
rong
(
n-
i
+
1
)

kh
o
á

c
ò
n
l

i


ưa

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




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

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



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ừ


—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
ư


₫ã


ượ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

×