Cơ sở dữ liệu (viết tắt CSDL; tiếng Anh là database) được hiểu theo cách định nghĩa kiểu kĩ thuật thì nó là một tập hợp thông tin có cấu trúc. Tuy nhiên, thuật ngữ này thường dùng trong công nghệ thông tin và nó thường được hiểu rõ hơn dưới dạng một tập hợp liên kết các dữ liệu, thường đủ lớn để lưu trên một thiết bị lưu trữ như đĩa hay băng. Dữ liệu này được duy trì dưới dạng một tập hợp các tập tin trong hệ điều hành hay được lưu trữ trong các hệ quản trị cơ sở dữ liệu.
2. Sau đây là một số ưu diểm mà CSDL mang lại: - Giảm sự trùng lặp thông tin xuống mức thấp nhất. Do đó đảm bảo thông tin có tính nhất quán và toàn vẹn dữ liệu. - Đảm bảo dữ liệu có thẻ được truy suất theo nhiều cách khác nhau - Nhiều người có thể sủ dụng một cơ sở dữ liệu.
3.Những vấn đề mà CSDL cần phải giải quyết.
- Tính chủ quyền của dữ liệu.
Thể hiện ở phương diện an toàn dữ liệu.
Khả năng biểu diễn mỗi liên hệ ngữ nghĩa của dữ liệu và tính chính xác của dữ liệu.
Người khai thác cơ sở dữ liệu phải cập nhật cho CSDL những thông tin mới nhất.
- Tính bảo mật và quyền khai thác thông tin của người sử dung.
Do ưu điểm CSDL có thể cho nhiều người khai thác đồng thời. nên cần phải có một cơ chế bảo mật phân quyền khai thác CSDL.
Các hệ điều hành nhiều người sử dụng hay cục bộ đều cung cấp cơ chết này.
- Tranh chấp dữ liệu.
Khi nhiều người cùng truy nhập CSDL với các mục đích khác nhau. Rất có t hể sẽ xảy ra hiện tượng tranh chấp dữ liệu.
Cần có cơ chết ưu tiên khi truy cập CSDL. Ví dụ: admin luôn có thể tru cập cơ sở dữ liệu.
Cấp quyền ưu tiên cho từng người khai thác.
- Đảm bảo an toàn dữ liệu khi có sự cố.
Khi CSDL nhiều và được quản lý tập trung. Khả năng rủi ro mất dữ liệu rất cao. Các nguyên nhân chính là mất điện đột ngột hoặc hỏng thiết bị lưu trữ.
Hiện tại có một số hệ điều hành đã có cơ chế tự động sao lưu ổ cúng và fix lỗi khi có sự cố xảy ra.
Tuy nhiên: cẩn tắc vô áy náy. Chúng ta nên sao lưu dự phòng cho dữ liệu đề phòng trường hợp xấu xảy ra.
95 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 1969 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Cơ sở dữ liệu toàn tập, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
p noäi.
4
Caùc giaûi thuaät
tìm kieám noäi
• Tìm tuần tự
• Tìm nhị phân
Tìm kiếm
5Caùc giaûi thuaät tìm kieám noäi
Baøi toaùn: Tìm vò trí xuaát hieän cuûa phaàn töû coù
giaù trò x treân danh saùch ñaëc a
•Taäp döõ lieäu ñöôïc löu tröõ laø daõy soá a1, a2, ... ,aN
int a[N];
•Khoaù caàn tìm laø x
int x;
6
Tìm kieám tuaàn töï
• Böôùc 1: i = Vò trí ñaàu;
• Böôùc 2: Neáu a[i] = x : Tìm thaáy. Döøng, vò trí
xuaát hieän: i
• Böôùc 3 : i = Vò trí keá(i);// xeùt tieáp phaàn töû keá
trong maûng
• Böôùc 4: Neáu i >Vò trí cuoái: //Heát maûng
Khoâng tìm thaáy. Döøng.
Ngöôïc laïi: Laëp laïi Böôùc 2.
7Tìm kieám tuaàn töï
• Ví duï: Cho daõy soá a
12 2 8 5 1 6 4 15
• Giaù trò caàn tìm: 8
• i = 1
8
Tìm kieám tuaàn töï
• i = 2
• i = 3
9Tìm kieám tuaàn töïïïï
int LinearSearch(int a[], int N, int x)
{
for (int i=0; (i<N)&&(a[i]!=x ); i++);
if (i<N)
return i; // a[i] laø phaàn töû coù khoaù x
return -1; // tìm heát maûng nhöng khoâng coù x
}
10
Tìm kieám tuaàn töï
• Caûi tieán caøi ñaët: duøng phöông phaùp “ñặt lính
canh”
– Ñaët theâm moät phaàn töû coù giaù trò x vaøo cuoái maûng
– Baûo ñaûm luoân tìm thaáy x trong maûng
– Sau ñoù döïa vaøo vò trí tìm thaáy ñeå keát luaän.
11
Tìm kieám tuaàn töï
int LinearSearch(int a[], int N, int x)
{
// maûng goàm N phaàn töû töø a[0]..a[N-1]
a[N] = x; // theâm lính canh vaøo cuoái daõy
for (int i=0; (a[i]!=x); i++);
if (i<N)
return i; // a[i] laø phaàn töû coù khoaù x
return -1; // tìm heát maûng nhöng khoâng coù x
}
12
Tìm kieám tuaàn töï
• Ñaùnh giaù giaûi thuaät:
• Vaäy giaûi thuaät tìm tuaàn töï coù ñoä phöùc taïp
tính toaùn caáp n: T(n) = O(n)
13
Tìm kieám tuaàn töï
Nhaän xeùt:
– Giaûi thuaät tìm tuyeán tính khoâng phuï thuoäc vaøo
thöù töï cuûa caùc phaàn töû trong danh saùch, do vaäy
ñaây laø phöông phaùp toång quaùt nhaát ñeå tìm kieám
treân moät danh saùch baát kyø.
– Moät thuaät toaùn coù theå ñöôïc caøi ñaët theo nhieàu
caùch khaùc nhau, kyõ thuaät caøi ñaët aûnh höôûng ñeán
toác ñoä thöïc hieän cuûa thuaät toaùn.
14
Tìm kieám nhò phaân
• Ñoái vôùi nhöõng daõy ñaõ sắp thöù töï (giaû söû thöù töï
taêng), caùc phaàn töû trong daõy coù quan heä
ai -1 ≤ ai ≤ ai+1
Neáu x > ai thì x chæ coù theå xuaát hieän trong
ñoaïn [ai+1 ,aN] cuûa daõy
Neáu x < ai thì x chæ coù theå xuaát hieän trong
ñoaïn [a1 ,ai-1] cuûa daõy
15
Tìm kieám nhò phaân
• YÙ töôûng cuûa giaûi thuaät laø taïi moãi böôùc tieán
haønh so saùnh x vôùi phaàn töû naèm ôû vò trí giöõa
cuûa daõy tìm kieám hieän haønh, döïa vaøo keát quaû
so saùnh naøy ñeå quyeát ñònh giôùi haïn daõy tìm
kieám ôû böôùc keá tieáp laø nöûa treân hay nöûa döôùi
cuûa daõy tìm kieám hieän haønh
16
Tìm kieám nhò phaân
Böôùc 1: left = VTÑ; right = VTC;
Böôùc 2: Trong khi left ≤ right laëp: //ñoaïn tìm kieám chöa roãng
Böôùc 21: mid = (left+right)/2; // laáy moác so saùnh
Böôùc 22: Neáu a[mid] = x: //Tìm thaáy.
Döøng, vò trí xuaát hieän: mid
Böôùc 23: Neáu a[mid] > x: //tìm x trong daõy con aleft .. amid -1
right = mid - 1;
Ngöôïc laïi //tìm x trong daõy con amid +1 .. aright
left = mid + 1;
//Heát laëp
Böôùc 3: Döøng, khoâng tìm thaáy.
17
Tìm kieám nhò phaân
• Ví duï: Cho daõy soá a goàm 8 phaàn töû:
1 2 4 5 6 8 12 15
• Giaù trò caàn tìm laø 8
18
Tìm kieám nhò phaân
• left = 1, right = 8, mid = 4
19
Tìm kieám nhò phaân
• left = 5, right = 8, mid = 6
20
Tìm kieám nhò phaân
int BinarySearch(int a[],int N,int x )
{
int left =0, right = N-1, midle;
while (left <= right)
{
midle = (left + right)/2;
if (x == a[midle])
return midle;//Tìm thaáy x taïi mid
if (x<a[midle])right = midle -1;
else left = midle +1;
}
return -1; // trong daõy khoâng coù x
}
21
Tìm kieám nhò phaân
• Ñaùnh giaù giaûi thuaät:
• Giaûi thuaät tìm nhò phaân coù ñoä phöùc taïp
tính toaùn caáp logn:
T(n) = O(log 2 n)
22
Tìm kieám nhò phaân
Nhaän xeùt:
– Giaûi thuaät tìm nhò phaân döïa vaøo quan heä giaù trò
cuûa caùc phaàn töû maûng ñeå ñònh höôùng trong quaù
trình tìm kieám, do vaäy chæ aùp duïng ñöôïc cho
nhöõng daõy ñaõ coù thöù töï.
– Giaûi thuaät tìm nhò phaân tieát kieäm thôøi gian hôn
raát nhieàu so vôùi giaûi thuaät tìm tuaàn töï do
Tnhò phaân (n) = O(log 2 n) < Ttuaàn töï (n) = O(n).
23
Tìm kieám nhò phaân
Nhaän xeùt:
– Khi muoán aùp duïng giaûi thuaät tìm nhò phaân caàn
phaûi xeùt ñeán thôøi gian saép xeáp daõy soá ñeå thoûa
ñieàu kieän daõy soá coù thöù töï. Thôøi gian naøy khoâng
nhoû, vaø khi daõy soá bieán ñoäng caàn phaûi tieán haønh
saép xeáp laïi => khuyeát ñieåm chính cho giaûi thuaät
tìm nhò phaân.
– Caàn caân nhaéc nhu caàu thöïc teá ñeå choïn moät trong
hai giaûi thuaät tìm kieám treân sao cho coù lôïi nhaát.
24
Ñònh nghóa baøi toaùn saép xeáp
• Saép xeáp laø quaù trình xöû lyù moät danh saùch caùc
phaàn töû (hoaëc caùc maãu tin) ñeå ñaët chuùng theo
moät thöù töï thoûa maõn moät tieâu chuaån naøo ñoù
döïa treân noäi dung thoâng tin löu giöõ taïi moãi
phaàn töû.
• Löu yù: Thöù töï ñöôïc ñeà caäp ôû ñaây laø moät thöù
töï toång quaùt.
• Ví duï: Haõy ñònh nghóa moät thöù töï ñeå daõy soá
sau laø daõy taêng theo thöù töï naøy.
1 3 5 7 22 20 10 6
25
Khaùi nieäm nghòch theá
• Khaùi nieäm nghòch theá:
– Xeùt moät maûng caùc soá a0, a1, … an.
– Neáu coù i aj, thì ta goïi ñoù laø moät nghòch
theá.
• Maûng chöa saép xeáp seõ coù nghòch theá.
• Maûng ñaõ coù thöù töï seõ khoâng chöùa nghòch theá.
a0 ≤ a1 ≤ … ≤ an
26
Caùc phöông phaùp saép xeáp thoâng duïng
• Selection sort
• Insertion sort
• Interchange sort
• Bubble sort
• Shaker sort
• Binary Insertion
sort
• Shell sort
• Heap sort
• Quick sort
• Merge sort
• Radix sort
• …
Ñôn giaûûn,
Chi phí cao
Phöùùc taïïp hôn
Hieääu quaûû cao
Lôùùp thuaäät toaùùn
khaùùc
27
Selection sort – YÙ töôûng
• Nhaän xeùt: Maûng coù thöù töï thì
ai = min(ai, ai+1, …, an-1)
YÙ töôûng: moâ phoûng moät trong nhöõng caùch saép
xeáp töï nhieân nhaát trong thöïc teá:
– Choïn phaàn töû nhoû nhaát trong N phaàn töû ban ñaàu,
ñöa phaàn töû naøy veà vò trí ñuùng laø ñaàu daõy hieän
haønh
– Xem daõy hieän haønh chæ coøn N-1 phaàn töû cuûa daõy
ban ñaàu, baét ñaàu töø vò trí thöù 2; laëp laïi quaù trình
treân cho daõy hieän haønh... ñeán khi daõy hieän haønh
chæ coøn 1 phaàn töû.
28
Selection sort – Thuaät toaùn
//input: daõy (a, N)
//output: daõy (a, N) ñaõ ñöôïc saép xeáp
• Böôùc 1 : i = Vò trí ñaàu;
• Böôùc 2 : Tìm phaàn töû a[min] nhoû nhaát trong daõy
hieän haønh töø a[i] ñeán a[N]
• Böôùc 3 : Neáu min ≠ i: Hoaùn vò a[min] vaø a[i]
• Böôùc 4 : Neáu i chöa laø Vò trí cuoái
» i = Vò trí keá(i);
» Laëp laïi Böôùc 2
Ngöôïc laïi: Döøng. //N phaàn töû ñaõ naèm
ñuùng vò trí.
29
Selection sort – Ví duï
2 8 5 1 6 4 1512
i
min
2 3 4 5 6 7 81
Find MinPos(1, 8) Swap(ai, amin)
30
Selection sort – Ví duï
2 8 5 12 6 4 151
i
min
2 3 4 5 6 7 81
Find MinPos(2, 8) Swap(ai, amin)
31
Selection sort – Ví duï
2 8 5 12 6 4 151
i
min
2 3 4 5 6 7 81
Find MinPos(3, 8) Swap(ai, amin)
32
Selection sort – Ví duï
2 4 5 12 6 8 151
i
min
2 3 4 5 6 7 81
Find MinPos(4, 8) Swap(ai, amin)
33
Selection sort – Ví duï
2 4 5 12 6 8 151
i
min
2 3 4 5 6 7 81
Find MinPos(5, 8) Swap(ai, amin)
34
Selection sort – Ví duï
2 4 5 6 12 8 151
i
min
2 3 4 5 6 7 81
Find MinPos(6, 8) Swap(ai, amin)
35
Selection sort – Ví duï
2 4 5 6 8 12 151
i
min
2 3 4 5 6 7 81
Find MinPos(7, 8) Swap(ai, amin)
36
Selection sort
void SelectionSort(int a[],int N )
{
int min; // chæ soá phaàn töû nhoû nhaát trong daõy hieän haønh
for (int i=0; i<N-1 ; i++)
{
min = i;
for(int j = i+1; j < N ; j++)
if (a[j] < a[min])
min = j; // ghi nhaän vò trí phaàn töû nhoû nhaát
if (min != i)
Swap(a[min], a[i]);
}
}
37
• Soá laàn hoaùn vò (moät hoaùn vò baèng 3 pheùp
gaùn) phuï thuoäc vaøo tình traïng ban ñaàu
cuûa daõy soá
Selection sort – Ñaùnh giaù giaûi thuaät
38
Selection sort – Ñaùnh giaù giaûi thuaät
• ÔÛû löôït thöù i, caàn (N-i) laàn so saùnh ñeå xaùc
ñònh phaàn töû nhoû nhaát hieän haønh.
• Soá löôïng pheùp so saùnh khoâng phuï thuoäc vaøo
tình traïng cuûa daõy soá ban ñaàu.
• Trong moïi tröôøng hôïp, soá laàn so saùnh laø:
2
1)n(ni)(n
1n
1i
−
=−∑
−
=
39
Insertion Sort – YÙ töôûng
• Nhaän xeùt: moïi daõy a1 , a2 ,..., an luoân coù i-1 phaàn töû
ñaàu tieân a1 , a2 ,... ,ai-1 ñaõ coù thöù töï (2 ≤ i).
YÙ töôûng chính: tìm caùch cheøn phaàn töû ai vaøo vò trí
thích hôïp cuûa ñoaïn ñaõ ñöôïc saép ñeå coù daõy môùi a1 ,
a2 ,... ,ai trôû neân coù thöù töï.
– Vò trí naøy chính laø pos thoûa apos-1 ≤ ai < apos (1≤pos≤i).
Chi tieát hôn:
– Daõy ban ñaàu a1 , a2 ,..., an, xem nhö ñaõ coù ñoaïn goàm moät
phaàn töû a1 ñaõ ñöôïc saép.
– Theâm a2 vaøo ñoaïn a1 seõ coù ñoaïn a1 a2 ñöôïc saép
– Theâm a3 vaøo ñoaïn a1 a2 ñeå coù ñoaïn a1 a2 a3 ñöôïc saép
– Tieáp tuïc cho ñeán khi theâm xong aN vaøo ñoaïn a1 a2 ...aN-1 seõ
coù daõy a1 a2.... aN ñöôïc saép.
40
Insertion Sort – Thuaät toaùn
//input: daõy (a, N)
//output: daõy (a, N) ñaõ ñöôïc saép xeáp
• Böôùc 1: i = 2; // giaû söû coù ñoaïn a[1] ñaõ ñöôïc saép
• Böôùc 2: x = a[i]; Tìm vò trí pos thích hôïp trong ñoaïn
a[1]
ñeán a[i] ñeå cheøn x vaøo
• Böôùc 3: Dôøi choã caùc phaàn töû töø a[pos] ñeán a[i-1] sang
phaûi 1 vò trí ñeå daønh choå cho x
• Böôùc 4: a[pos] = x; // coù ñoaïn a[1]..a[i] ñaõ ñöôïc saép
• Böôùc 5: i = i+1;
Neáu i ≤ n : Laëp laïi Böôùc 2.
Ngöôïc laïi : Döøng.
41
Insertion Sort – Ví duï
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
42
2 8 5 1 6 4 1512
i
x
2 3 4 5 6 7 81
pos
2
Insertion Sort – Ví duï
Insert a2 into (1, 2)
43
12 8 5 1 6 4 152
i
x
2 3 4 5 6 7 81
pos
Insertion Sort – Ví duï
Insert a3 into (1, 3)
8
44
8 12 5 1 6 4 152
i
x
2 3 4 5 6 7 81
pos
Insertion Sort – Ví duï
Insert a4 into (1, 4)
5
45
5 8 12 1 6 4 152
i
x
2 3 4 5 6 7 81
pos
Insertion Sort – Ví duï
Insert a5 into (1, 5)
1
46
2 5 8 12 6 4 151
i
x
2 3 4 5 6 7 81
pos
Insertion Sort – Ví duï
Insert a6 into (1, 6)
6
47
2 5 6 8 12 4 151
i
x
2 3 4 5 6 7 81
pos
Insertion Sort – Ví duï
Insert a7 into (1, 7)
4
48
2 4 5 6 8 12 151
i
x
2 3 4 5 6 7 81
pos
Insertion Sort – Ví duï
Insert a8 into (1, 8)
49
2 4 5 6 8 12 151
pos
2 3 4 5 6 7 81
Insertion Sort – Ví duï
50
Insertion Sort – Caøi ñaët
void InsertionSort(int a[], int N )
{
int pos, i;
int x;//löu tröõ a[i] traùnh bò ghi ñeø khi dôøi choã caùc phaàn töû.
for(int i=1 ; i<N ; i++) //ñoaïn a[0] ñaõ saép
{
x = a[i];
for(pos=i;(pos>0)&&(a[pos-1]>x);pos--)
a[pos] = a[pos-1];
a[pos] = x;// cheøn x vaøo daõy
}
}
51
Insertion Sort – Nhaän xeùt
• Khi tìm vò trí thích hôïp ñeå cheøn a[i] vaøo ñoaïn
a[0] ñeán a[i-1], do ñoaïn ñaõ ñöôïc saép coù theå
söû duïng giaûi thuaät tìm nhò phaân ñeå thöïc hieän
vieäc tìm vò trí pos giaûi thuaät saép xeáp cheøn
nhò phaân Binary Insertion Sort
– Löu yù: Cheøn nhò phaân chæ laøm giaûm soá laàn so saùnh,
khoâng laøm giaûm soá laàn dôøi choã.
• Ngoaøi ra, coù theå caûi tieán giaûi thuaät cheøn tröïc
tieáp vôùi phaàn töû caàm canh ñeå giaûm ñieàu kieän
kieåm tra khi xaùc ñònh vò trí pos.
52
Binary Insertion Sort – Caøi ñaët
void BInsertionSort(int a[], int N )
{ int l,r,m,i;
int x;//löu tröõ giaù trò a[i] traùnh bò ghi ñeø khi dôøi choã caùc phaàn
töû.
for(int i=1 ; i<N ; i++)
{ x = a[i]; l = 1; r = i-1;
while(l<=r) // tìm vò trí cheøn x
{ m = (l+r)/2; // tìm vò trí thích hôïp m
if(x < a[m]) r = m-1;
else l = m+1;
}
for(int j = i ; j >l ; j--)
a[j] = a[j-1]; // dôøi choã caùc phaàn töû seõ ñöùng sau
x
a[l] = x; // cheøn x vaøo daõy
}
}
53
Insertion Sort – Ñaùnh giaù giaûi thuaät
• Caùc pheùp so saùnh xaûy ra trong moãi voøng laëp tìm vò trí
thích hôïp pos. Moãi laàn xaùc ñònh vò trí pos ñang xeùt
khoâng thích hôïp dôøi choã phaàn töû a[pos-1] ñeán vò trí
pos.
• Giaûi thuaät thöïc hieän taát caû N-1 voøng laëp tìm pos, do soá
löôïng pheùp so saùnh vaø dôøi choã naøy phuï thuoäc vaøo tình
traïng cuûa daõy soá ban ñaàu, neân chæ coù theå öôùc löôïc trong
töøng tröôøng hôïp nhö sau:
Phương pháp ñổi chỗ trực tiếp
Interchange Sort
55
Interchange Sort – YÙ töôûng
• Nhaän xeùt: Ñeå saép xeáp moät daõy soá, ta coù
theå xeùt caùc nghòch theá coù trong daõy vaø
laøm trieät tieâu daàn chuùng ñi.
YÙ töôûng chính:
– Xuaát phaùt töø ñaàu daõy, tìm taát caû nghòch theá
chöùa phaàn töû naøy, trieät tieâu chuùng baèng
caùch ñoåi choã phaàn töû naøy vôùi phaàn töû töông
öùng trong caëp nghòch theá.
– Laëp laïi xöû lyù treân vôùi caùc phaàn töû tieáp theo
trong daõy
56
Interchange Sort – Thuaät toaùn
//input: daõy (a, N)
//output: daõy (a, N) ñaõ ñöôïc saép xeáp
• Böôùc 1 : i = 1; // baét ñaàu töø ñaàu daõy
• Böôùc 2 : j = i+1; //tìm caùc caëp phaàn töû a[j] <
a[i], j>i
• Böôùc 3 : Trong khi j ≤ N thöïc hieän
• Neáu a[j]<a[i]: a[i]↔a[j];
• j = j+1;
• Böôùc 4 : i = i+1;
– Neáu i < n: Laëp laïi Böôùc 2.
– Ngöôïc laïi: Döøng.
57
Interchange Sort – Ví duï
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
i
j
1
58
Interchange Sort – Ví duï
12 8 5 2 6 4 151
2 3 4 5 6 7 81
i
j
2
59
Interchange Sort – Ví duï
2 12 8 5 6 4 151
2 3 4 5 6 7 81
i
j
4
60
Interchange Sort – Ví duï
2 4 12 8 6 5 151
2 3 4 5 6 7 81
i
j
5
61
Interchange Sort – Ví duï
2 4 5 6 8 12 151
2 3 4 5 6 7 81
62
Interchange Sort - Caøi ñaët
void InterchangeSort(int a[], int N)
{
int i, j;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++)
if(a[j]< a[i]) //neáu coù nghòch theá
thì ñoåi choã
Swap(a[i],a[j]);
}
63
Interchange Sort
Ñaùnh giaù giaûi thuaät• Soá löôïng caùc pheùp so saùnh xaûy ra khoâng phuï
thuoäc vaøo tình traïng cuûa daõy soá ban ñaàu
• Soá löôïng pheùp hoaùn vò thöïc hieän tuøy thuoäc
vaøo keát quaû so saùnh
Phương pháp nổi bọt
Bubble sort
65
Bubble sort – YÙ töôûng
• YÙ töôûng chính:
– Xuaát phaùt töø cuoái (ñaàu) daõy, ñoåi choã caùc
caëp phaàn töû keá caän ñeå ñöa phaàn töû nhoû
(lôùn) hôn trong caëp phaàn töû ñoù veà vò trí
ñuùng ñaàu (cuoái) daõy hieän haønh, sau ñoù seõ
khoâng xeùt ñeán noù ôû böôùc tieáp theo,
– ÔÛ laàn xöû lyù thöù i coù vò trí ñaàu daõy laø i
– Laëp laïi xöû lyù treân cho ñeán khi khoâng coøn
caëp phaàn töû naøo ñeå xeùt.
66
Bubble sort – Thuaät toaùn
//input: daõy (a, N)
//output: daõy (a, N) ñaõ ñöôïc saép xeáp
• Böôùc 1 : i = Vò trí ñaàu;
• Böôùc 2 : j = Vò trí cuoái;//Duyeät töø cuoái daõy ngöôïc
veà vò trí i
– Trong khi (j > i) thöïc hieän:
• Neáu a[j]<a[j-1]: a[j]↔a[j-1];//xeùt caëp phaàn töû keá caän
• j = Vò trí tröôùc(j);
• Böôùc 3 : i = Vò trí keá(i); // laàn xöû lyù keá tieáp
– Neáu i = Vò trí cuoái: Döøng. // Heát daõy.
– Ngöôïc laïi : Laëp laïi Böôùc 2.
67
Bubble Sort – Ví duï
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
i
j
1
68
Bubble Sort – Ví duï
12 2 8 5 4 6 151
2 3 4 5 6 7 81
i
j
2
69
Bubble Sort – Ví duï
2 12 4 8 5 6 151
2 3 4 5 6 7 81
i
j
4
70
Bubble Sort – Ví duï
2 4 12 8 5 6 151
2 3 4 5 6 7 81
i
j
5
71
Bubble Sort – Ví duï
2 4 5 12 8 6 151
2 3 4 5 6 7 81
i
j
6
72
Bubble Sort – Ví duï
2 4 5 6 12 8 151
2 3 4 5 6 7 81
i
j
8
73
Bubble Sort – Ví duï
2 4 5 6 8 12 151
2 3 4 5 6 7 81
i
j
74
Bubble sort - Caøi ñaët
void BubbleSort(int a[], int N)
{
int i, j;
for (i = 0 ; i < N-1 ; i++)
for (j = N-1; j>i ; j --)
if(a[j]< a[j-1])
Swap(a[j], a[j-1]);
}
75
Bubble sort - Ñaùnh giaù giaûi thuaät
• Soá löôïng caùc pheùp so saùnh xaûy ra khoâng phuï
thuoäc vaøo tình traïng cuûa daõy soá ban ñaàu
• Soá löôïng pheùp hoaùn vò thöïc hieän tuøy thuoäc
vaøo keát quaû so saùnh
76
• Khuyeát ñieåm:
– Khoâng nhaän dieän ñöôïc tình traïng daõy ñaõ coù
thöù töï hay coù thöù töï töøng phaàn.
– Caùc phaàn töû nhoû ñöôïc ñöa veà vò trí ñuùng raát
nhanh, trong khi caùc phaàn töû lôùn laïi ñöôïc
ñöa veà vò trí ñuùng raát chaäm.
Bubble sort - Ñaùnh giaù giaûi thuaät
77
Bubble sort – Caûi tieán
• Giaûi thuaät ShakerSort:
– Döïa treân nguyeân taéc ñoåi choã tröïc tieáp
– Tìm caùch khaéc phuïc caùc nhöôïc ñieåm cuûa
BubleSort
• Trong moãi laàn saép xeáp, duyeät maûng theo 2 löôït
töø 2 phía khaùc nhau :
– Löôït ñi: ñaåy phaàn töû nhoû veà ñaàu maûng
– Löôït veà: ñaåy phaàn töû lôùn veà cuoái maûng
• Ghi nhaän laïi nhöõng ñoaïn ñaõ saép xeáp nhaèm tieát
kieäm caùc pheùp so saùnh thöøa.
78
Giaûi thuaät ShakerSort
//input: daõy (a, N)
//output: daõy (a, N) ñaõ ñöôïc saép xeáp
• Böôùc 1 :
– l = 1; r = n; //töø l ñeán r laø ñoaïn caàn ñöôïc saép xeáp
– k = n; // ghi nhaän laïi vò trí k xaûy ra hoaùn vò sau cuøng
// ñeå laøm cô sôû thu heïp ñoaïn l ñeán r
• Böôùc 2 :
– Böôùc 2a : j = r ; // ñaåy phaàn töû nhoû veà ñaàu maûng
• Trong khi (j > l) :
– Neáu a[j]<a[j-1]: a[j] ↔ a[j-1];
» k = j; //löu laïi nôi xaûy ra hoaùn vò
– j = j-1;
• l = k; //loaïi bôùt caùc phaàn töû ñaõ coù thöù töï ôû ñaàu daõy
79
Giaûi thuaät ShakerSort
• Böôùc 2 :
– Böôùc 2b : j = l ; // ñaåy phaàn töû lôùn veà cuoái maûng
• Trong khi (j < r) :
– Neáu a[j]>a[j+1]: a[j] ↔ a[j+1];
» k = j;//löu laïi nôi xaûy ra hoaùn vò
– j = j+1;
• r = k; //loaïi bôùt caùc phaàn töû ñaõ coù thöù töï ôû cuoái daõy
• Böôùc 3 : Neáu l < r: Laëp laïi Böôùc 2.
80
Saép xeáp caây - Heap sort
• Khi tìm phaàn töû nhoû nhaát ôû böôùc i, phöông
phaùp saép xeáp choïn tröïc tieáp khoâng taän duïng
ñöôïc caùc thoâng tin ñaõ coù ñöôïc do caùc pheùp so
saùnh ôû böôùc i-1.
• Giaûi thuaät Heap Sort khaéc phuïc nhöôïc ñieåm
naøy baèng caùch choïn ra ñöôïc moät caáu truùc döõ
lieäu cho pheùp tích luõy caùc thoâng tin veà söï so
saùnh giaù trò caùc phaàn töû trong quaù trình saép
xeáp.
81
Sắp xếp cây - Heap sort
• Xét dãy số : 5 2 6 4 8 1
• Giả sử các phần tử của dãy ñược bố trí
theo quan hệ so sánh và tạo thành sơ
ñồ dạng cây:
82
Saép xeáp caây - Heap sort
• Phaàn töû ôû möùc i chính laø phaàn töû lôùn trong caëp
phaàn töû töông öùng ôû möùc i+1
⇒ phaàn töû ôû möùc 0 (nuùt goác cuûa caây) luoân laø phaàn töû
lôùn nhaát cuûa daõy.
• Neáu loaïi boû phaàn töû goác ra khoûi caây (nghóa laø ñöa
phaàn töû lôùn nhaát veà ñuùng vò trí), thì vieäc caäp nhaät
caây chæ xaûy ra treân nhöõng nhaùnh lieân quan ñeán
phaàn töû môùi loaïi boû, coøn caùc nhaùnh khaùc ñöôïc baûo
toaøn, nghóa laø böôùc keá tieáp coù theå söû duïng laïi caùc
keát quaû so saùnh ôû böôùc hieän taïi.
83
Saép xeáp caây - Heap sort
• Loaïi boû 8 ra khoûi caây vaø theá vaøo caùc choã
troáng giaù trò -∞ ñeå tieän vieäc caäp nhaät laïi caây :
84
Saép xeáp caây - Heap sort
• Toaøn boä nhaùnh traùi cuûa caây cuõ ñöôïc baûo
toaøn
⇒ Böôùc keá tieáp ñeå choïn ñöôïc phaàn töû lôùn
nhaát hieän haønh laø 6, chæ caàn laøm theâm
moät pheùp so saùnh 1 vôùi 6.
85
Saép xeáp caây - Heap sort
• Tieán haønh nhieàu laàn vieäc loaïi boû phaàn töû goác cuûa
caây cho ñeán khi taát caû caùc phaàn töû cuûa caây ñeàu laø -
∞, khi ñoù xeáp caùc phaàn töû theo thöù töï loaïi boû treân
caây seõ coù daõy ñaõ saép xeáp.
• Ñeå caøi ñaët thuaät toaùn hieäu quaû, caàn phaûi toå chöùc
moät caáu truùc löu tröõ döõ lieäu coù khaû naêng theå hieän
ñöôïc quan heä cuûa caùc phaàn töû trong caây vôùi n oâ nhôù
thay vì 2n-1 nhö trong ví duï.
• Khaùi nieäm heap vaø phöông phaùp saép xeáp Heapsort
do J.Williams ñeà xuaát ñaõ giaûi quyeát ñöôïc caùc khoù
khaên treân.
86
Saép xeáp caây - Heap sort
• Ñònh nghóa heap:
– Heap laø moät daõy caùc phaàn töû aleft, aleft+1,... ,
aright thoaû caùc quan heä:
• ai ≥ a2i
• ai ≥ a2i+1
vôùi ∀i ∈ [left, right]
– Khi ñoù (ai , a2i), (ai ,a2i+1) ñöôïc goïi laø caùc caëp
phaàn töû lieân ñôùi.
– Heap ñöôïc ñònh nghóa nhö treân ñöôïc duøng
trong tröôøng hôïp saép xeáp taêng daàn, khi saép
xeáp giaûm daàn phaûi ñoåi chieàu caùc quan heä.
87
Ví duï daõy laø heap:
12 8 5 1 4 6 215
2 3 4 5 6 7 81
88
Saép xeáp caây – Heap sort
a2 a3
a4 a5 a6 a7
a8
a1 Caùc phaàn töû
cuûa daõy ñöôïc
bieåu dieãn theo
caùc moái quan
heä lieân ñôùi
89
Saép xeáp caây - Heap sort
• Moät soá tính chaát cuûa Heap:
– Tính chaát 1: Neáu aleft, aleft+1, …, aright laø moät
heap thì khi caét boû moät soá phaàn töû ôû hai
ñaàu cuûa heap, daõy con coøn laïi vaãn laø moät
heap.
– Tính chaát 2: Neáu a1, a2, …, an laø moät heap
thì phaàn töû a1 (ñaàu heap) luoân laø phaàn töû
lôùn nhaát trong heap.
– Tính chaát 3: Moïi daõy con aleft, aleft+1, ...,
aright thoûa: 2left > right ñeàu laø heap.
90
Ví duï caùc tính chaát cuûa heap:
12 8 5 1 6 4 215
2 3 4 5 6 7 81
12 8 5 1 6 4
1 6 4 2
91
Saép xeáp caây - Heap sort
• Saép xeáp daõy taêng daàn qua 2 giai ñoaïn:
– Giai ñoaïn 1: Döïa vaøo tính chaát 3 cuûa heap
ñeå hieäu chænh daõy ban ñaàu thaønh heap
– Giai ñoaïn 2: Döïa vaøo caùc tính chaát 1 vaø 2
cuûa heap ñeå saép xeáp heap coù ñöôïc sau giai
ñoaïn 1 thaønh daõy taêng daàn
92
Heap sort – Giai ñoaïn 1
• Vaán ñeà: Ñoåi choå moät soá phaàn töû treân
daõy a1, …, aN ñeå daõy trôû thaønh heap.
• YÙ töôûng: theo tính chaát 3, daõy con an/2+1 ,
an/2+2 ... an ñöông nhieân laø heap. Laàn löôït
theâm vaøo phía tröôùc daõy caùc phaàn töû
an/2, an/2-1, …, a1; moãi böôùc theâm vaøo caàn
hieäu chænh vò trí caùc phaàn töû theo moái
quan heä lieân ñôùi ta seõ nhaän ñöôïc heap
mong muoán.
93
Heap sort – Giai ñoaïn 1
//input: daõy (a, N)
//output: daõy (a, N) laø moät heap
• Böôùc 1: left = N/2; //Theâm caùc phaàn töû
aleft, .., a1 vaøo heap
• Böôùc 2: Trong khi left > 0
//Löu yù: ñoaïn aleft+1, …, aN ñaõ laø heap
• Böôùc 21: Hieäu chænh ñoaïn aleft, …, aN thaønh heap
• Böôùc 22: left = left - 1;
//Heát laëp
94
Heap sort – Giai ñoaïn 1
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
95
15
Heap sort – Giai ñoaïn 1
2 8 5 1 6 412
2 3 4 5 6 7 81
left
jointjointcurr
5
96
Heap sort – Giai ñoaïn 1
2 8 15 1 6 4 512
2 3 4 5 6 7 81
left
jointjointcurr joint
97
Heap sort – Giai ñoaïn 1
15 8 5 1 6 4 212
2 3 4 5 6 7 81
left
jointjointcurr
98
Heap sort – Giai ñoaïn 1
12 8 5 1 6 4 215
2 3 4 5 6 7 81
99
Heap sort – Giai ñoaïn 2
• Vaán ñeà: Saép xeáp heap a1, …, aN thaønh daõy taêng
daàn
//Ñaët: right = N daõy a1, …, aright laø heap.
• YÙ töôûng:
– Theo tính chaát 2: a1 seõ laø phaàn töû lôùn nhaát, vì vaäy vò
trí ñuùng cuûa a1 phaûi laø right - cuoái daõy.
Ñoåi choå (a1, aright) ñöôïc theâm moät phaàn töû ôû ñuùng vò trí
Theo tính chaát 3: daõy con a2, …, aright-1 vaãn laø heap
Giaûm right, theâm a1 vaøo daõy vaø hieäu chænh laïi
daõy a1, …, aright laø heap.
100
Heap sort – Giai ñoaïn 2
//input: daõy (a, N) laø heap
//output: daõy (a, N) saép taêng daàn
• Böôùc 1: right = N; //Baét ñaàu thöïc hieän töø cuoái
daõy
• Böôùc 2: Trong khi right > 1
//Ñöa phaàn töû lôùn nhaát (a1)veà vò trí right
• Böôùc 21: Hoaùnvò (a1 , aright);
//Loaïi boû phaàn töû lôùn nhaát ra khoûi heap
• Böôùc 22: right := right -1;
• Böôùc 23: Hieäu chænh ñoaïn a1, a2, …, aright thaønh heap
//Heát laëp
101
Heap sort – Giai ñoaïn 2
12 8 5 1 6 4 215
2 3 4 5 6 7 81
right
Swap(a1, aright)
102
Heap sort – Giai ñoaïn 2
12 8 5 1 6 4 152
2 3 4 5 6 7 81
right
Shift(a, 1, right)
jointjointcurr
103
Heap sort – Giai ñoaïn 2
5 8 2 1 6 4 1512
2 3 4 5 6 7 81
right
Swap(a1, aright)
104
Heap sort – Giai ñoaïn 2
5 8 2 1 6 12 154
2 3 4 5 6 7 81
right
jointjointcurr joint
Shift(a, 1, right)
105
Heap sort – Giai ñoaïn 2
5 6 2 1 4 12 158
2 3 4 5 6 7 81
right
Swap(a1, aright)
106
Heap sort – Giai ñoaïn 2
5 6 2 1 8 12 154
2 3 4 5 6 7 81
2 4 5 6 8 12 151
107
Heap sort – Hieäu chænh heap
• Vaán ñeà: daõy con aleft+1, aleft+2, …, aright laø heap,
caàn hieäu chænh laïi ñeå aleft, …, aright laø heap
• YÙ töôûng: do aleft+1, aleft+2, …, aright laø heap neân taát
caû caùc phaàn töû naøy ñeàu ñaõ thoûa ñieàu kieän lieân
ñôùi vaán ñeà trôû thaønh: kieåm tra quan heä lieân
ñôùi cuûa aleft vaø ñoåi choå aleft vôùi lieân ñôùi thích hôïp
cuûa noù neáu quan heä lieân ñôùi bò vi phaïm; sau khi
hieäu chænh söï vi phaïm ñieàu kieän lieân ñôùi coù theå
lan truyeàn ñeán caùc vò trí môùi hieäu chænh.
108
2
Heap sort – Hieäu chænh heap
2 8 15 1 6 4 5
2 3 4 5 6 7 81
left
jointjointcurr joint
right
109
Heap sort – Hieäu chænh heap
• Nhaän xeùt: Quaù trình hieäu chænh coù nhieàu
böôùc ñoåi choã trung gian khoâng caàn thieát.
• Trong ví duï: ñoåi choã (2, 15), sau ñoù ñoåi choå
tieáp (2, 5): vò trí cuoái cuøng cuûa 2 laø 8, 2 ôû vò
trí 4 chæ laø taïm thôøi, khoâng caàn thieát.
Coù theå thöïc hieän vieäc dôøi choã haøng loaït,
sau ñoù ñöa giaù trò caàn hieäu chænh vaøo ñuùng
choã
110
Heap sort – Hieäu chænh heap
//input: daõy con aleft+1, aleft+2, …, aright laø heap
//output: daõy con aleft, aleft+1, …, aright laø heap
• Böôùc 1:
• curr = left; x = acurr; //Baét ñaàu kieåm tra töø vò trí left
• joint = 2*curr; //Lieân ñôùi thöù nhaát cuûa curr
• Böôùc 2: Trong khi (joint ≤ right) //Coøn lieân ñôùi
ñeå xeùt
• Böôùc 21: Neáu (joint ajoint)
joint = joint + 1; //joint: vò trí lieân ñôùi lôùn nhaát
• Böôùc 22: Neáu ajoint ≤ x //Thoûa ñieàu kieän lieân ñôùi
Chuyeån ñeán Böôùc 3
• Böôùc 23: acurr = ajoint; curr = joint; joint = 2*curr;
//Heát laëp
• Böôùc 3: acurr = x;
111
2
Heap sort – Hieäu chænh heap
2 8 15 1 6 4 5
2 3 4 5 6 7 81
left
jointcurr joint???
right
112
Heap sort – Caøi ñaët
• Ñeå caøi ñaët giaûi thuaät Heapsort caàn xaây
döïng caùc thuû tuïc:
– Thuû tuïc hieäu chænh daõy aleft, aleft+1, …, aright
thaønh heap:
void Shift (int a[], int left, int right)
– Thuû tuïc chuyển ñổi daõy a0, a2, …, aN-1 thaønh
heap:
void CreateHeap(int a[], int N )
– Thuû tuïc saép xeáp daõy a0, a2, …, aN-1 taêng daàn:
void HeapSort(int a[], int N)
113
Heap sort – Caøi ñaët
void Shift (int a[], int left, int right)
{
int x, curr, joint;
curr = left; joint =2*curr+1;// ajoint: phaàn töû lieân ñôùi
x = a[curr];
while (joint <= right)
{
if (joint < right) // neáu coù ñuû 2 phaàn töû lieân ñôùi
if (a[joint] < a[joint+1])
joint = joint+1;
if (a[joint]<x) break; //thoaû quan heä lieân ñôùi
a[curr] = a[joint];
curr = joint; // xeùt tieáp khaû naêng hieäu chænh lan truyeàn
joint = 2*curr+1;
}
a[curr] = x;
}
114
Heap sort – Caøi ñaët
void CreateHeap(int a[], int N)
{
int left;
//left: vị trí phần tử cần ghép thêm
for (left = (N-1)/2; left >= 0; left
--)
Shift(a, left, N-1);
}
115
void HeapSort (int a[], int N)
{
int right;
CreateHeap(a, N); //saép xeáp daõy a thanh heap
right = N-1; // right laø vò trí ñuùng cho phaàn töû lôùn nhaát
while (right > 0)
{
Swap(a[0],a[right]);
right --;
Shift(a,0,right);
}
}
Heap Sort – Caøi ñaët
116
Heap Sort – Ñaùnh giaù giaûi thuaät
• Vieäc ñaùnh giaù moät caùch chính xaùc giaûi thuaät
Heapsort raát phöùc taïp. Tuy nhieân, coù theå ñaùnh giaù
moät caùch töông ñoái döïa vaøo moät soá nhaän xeùt:
– Khi xem xeùt heap ôû daïng caây quan heä lieân ñôùi caùc
phaàn töû cuûa heap taïo thaønh caây nhò phaân coù ñoä cao
h≈log2N.
– ÔÛ moãi böôùc hieäu chænh, soá pheùp ñieàu chænh caùc vi phaïm
lieân ñôùi khoâng vöôït quaù chieàu cao h cuûa caây lieân ñôùi.
– ÔÛ caû giai ñoaïn 1 vaø giai ñoaïn 2 soá pheùp hieäu chænh
khoâng vöôït quaù N
Trong tröôøng hôïp xaáu nhaát ñoä phöùc taïp thuaät toaùn
O(Nlog2N)
117
Shell sort – YÙ töôûng
• ShellSort laø moät phöông phaùp caûi tieán cuûa phöông phaùp
saép xeáp cheøn tröïc tieáp. YÙ töôûng cuûa phöông phaùp saép
xeáp naøy laø xem xeùt daõy ban ñaàu nhö nhöõng daõy con goàm
caùc phaàn töû ôû caùch nhau len vò trí; tieán haønh saép xeáp
treân töøng daõy con; giaûm daàn böôùc len ñeán khi len = 1
saép xeáp xong:
• Daõy ban ñaàu : a1, a2, ..., aN ñöôïc xem nhö söï xen keõ cuûa
caùc daõy con sau :
– Daõy con thöù nhaát : a1 alen+1 a2len+1 ...
– Daõy con thöù hai : a2 alen+2 a2len+2 ...
– ....
– Daõy con thöù len : alen a2len a3len ...
118
• Vieäc saép xeáp caùc phaàn töû trong cuøng daõy con seõ laøm cho
caùc phaàn töû ñöôïc ñöa veà vò trí ñuùng töông ñoái (chæ ñuùng
trong daõy con, so vôùi toaøn boä caùc phaàn töû trong daõy ban
ñaàu coù theå chöa ñuùng) moät caùch nhanh choùng.
• Khi khoaûng caùch len giaûm taïo thaønh caùc daõy con môùi
moät phaàn töû ñöôïc so saùnh vôùi nhieàu phaàn töû khaùc tröôùc
ñoù khoâng ôû cuøng daõy con vôùi noù.
• Thuaät toaùn döøng sau khi saép xong daõy con vôùi len = 1,
thuaät toaùn luùc naøy thöïc hieän nhö thuaät toaùn cheøn tröïc
tieáp. Tuy nhieân, phaàn lôùn caùc phaàn töû trong daõy ñaõ coù
thöù töï boä phaän.
• Caùc phaàn töû treân cuøng moät daõy con caùch nhau len vò trí
ñöôïc goïi laø cuøng daõy lieân ñôùi böôùc len.
Shell sort – YÙ töôûng
119
Shell sort – Thuaät toaùn
//input: daõy (a, N); daõy (h, k): k ñoä daøi caùc böôùc laëp -
const
//output: daõy (a, N) laø ñöôïc saép taêng daàn
• Böôùc 1: step = 1; //h[step]: ñoä daøi böôùc laëp
• Böôùc 2: Trong khi (step ≤ k) //ñoä daøi böôùc
coøn >1
• Böôùc 21: len = h[step]; //laáy ñoä daøi böôùc
• Böôùc 22: Laëp vôùi i=len+1 .. N //saép xeáp caùc daõy lieân
//ñôùi böôùc len
Cheøn a[i] vaøo daõy lieân ñôùi böôùc len;
• Böôùc 23: step ++;
//Heát laëp
120
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 5;
currjoint
121
2 8 5 1 12 4 156
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 5;
122
2 15 5 1 12 4 86
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 3
currjoint
123
1 12 6 2 15 4 85
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 3
currjoint joint
124
1 12 5 2 15 6 84
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 3
125
jointcurr
1 12 5 2 15 6 84
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 1
joint joint
126
jointcurrjoint
4 5 12 2 15 6 81
2 3 4 5 6 7 81
Shell sort – Ví duï
h = (5, 3, 1); k = 3len = 1
joint joint joint joint joint
127
2 4 5 6 8 12 151
2 3 4 5 6 7 81
Shell sort – Ví duï
128
Shell sort – Caøi ñaët
int h[MAXK], k;
void ShellSort(int a[], int N)
{
int step, i, pos, x, len;
for (step = 0 ; step <k; step ++)
{
len = h[step]; //khoaûng caùch 2 phaàn töû lieân tieáp cuûa daõy
con
for (i = len; i <N; i++)
{
x = a[i];
for(pos=i;(pos-len>=0)&&(x<a[pos-len]);pos-=len)
a[pos] = a[pos-len];
a[pos] = x;
}
}
}
129
• Yeáu toá quyeát ñònh tính hieäu quaû cuûa thuaät
toaùn:
– Caùch choïn khoaûng caùch h trong töøng böôùc saép xeáp
– Soá böôùc saép xeáp.
• Giaû söû quyeát ñònh saép xeáp k böôùc, caùc khoaûng
caùch choïn phaûi thoûa ñieàu kieän :
hi > hi+1 vaø hk = 1
Shell sort – Ñaùnh giaù giaûi thuaät
130
• Chöa coù tieâu chuaån roõ raøng trong vieäc löïa choïn daõy
giaù trò khoaûng caùch toát nhaát. Moät gôïi yù: daõy ñöôïc
choïn khoâng neân coù caùc soá laø boäi soá cuûa nhau.
• Moät soá daõy ñöôïc Knuth ñeà nghò :
hi = (hi-1 - 1)/3 vaø hk = 1, k = log3n-1
ví duï: 121, 40, 13, 4, 1
hay
hi = (hi-1 - 1)/2 vaø hk = 1, k = log2n-1
ví duï: 15, 7, 3, 1
Shell sort – Ñaùnh giaù giaûi thuaät
131
• Vieäc ñaùnh giaù giaûi thuaät Shellsort daãn ñeán
nhöõng vaán ñeà toaùn hoïc raát phöùc taïp, thaäm chí
moät soá chöa ñöôïc chöùng minh.
• Hieäu quaû cuûa thuaät toaùn coøn phuï thuoäc vaøo
daõy caùc ñoä daøi ñöôïc choïn.
• Trong tröôøng hôïp choïn daõy ñoä daøi theo coâng
thöùc
hi = (hi-1 - 1)/2 vaø hk = 1, k = log2N-1
thì giaûi thuaät coù ñoä phöùc taïp ≈ n1,2 << n2
Shell sort – Ñaùnh giaù giaûi thuaät
Sắp xếp dựa trên phân hoạch
Quick sort
133
Quick sort – YÙ töôûng
• Moät vaøi haïn cheá cuûa thuaät toaùn Ñoåi choã tröïc
tieáp:
– Moãi laàn ñoåi choå chæ thay ñoåi 1 caëp phaàn töû trong
nghòch theá; caùc tröôøng hôïp nhö: i aj >
ak (*) chæ caàn thöïc hieän 1 laàn ñoåi choå (ai, ak): thuaät
toaùn khoâng laøm ñöôïc.
– Ñoä phöùc taïp cuûa thuaät toaùn O(N2) khi N ñuû lôùn
thuaät toaùn seõ raát chaäm
YÙ töôûng: phaân chia daõy thaønh caùc ñoaïn con
taän duïng ñöôïc caùc pheùp ñoåi choã daïng (*) vaø laøm
giaûm ñoä daøi daõy khi saép xeáp caûi thieän ñaùng
keå ñoä phöùc taïp cuûa thuaät toaùn.
134
Quick sort – YÙ töôûng
• Giaûi thuaät QuickSort saép xeáp daõy a1, a2 ..., aN döïa
treân vieäc phaân hoaïch daõy ban ñaàu thaønh 3 phaàn :
– Phaàn 1: Goàm caùc phaàn töû coù giaù trò khoâng lôùn hôn x
– Phaàn 2: Goàm caùc phaàn töû coù giaù trò baèng x
– Phaàn 3: Goàm caùc phaàn töû coù giaù trò khoâng beù hôn x
vôùi x laø giaù trò cuûa moät phaàn töû tuøy yù trong daõy
ban ñaàu.
• Sau khi thöïc hieän phaân hoaïch, daõy ban ñaàu ñöôïc
phaân thaønh 3 ñoaïn:
– 1. ak ≤ x , vôùi k = 1 .. j
– 2. ak = x , vôùi k = j+1 .. i-1
– 3. ak ≥ x , vôùi k = i..N
135
• Ñoaïn thöù 2 ñaõ coù thöù töï.
• Neáu caùc ñoaïn 1 vaø 3 chæ coù 1 phaàn töû thì chuùng cuõng
ñaõ coù thöù töï, khi ñoù daõy con ban ñaàu ñaõ ñöôïc saép.
• Ngöôïc laïi, neáu caùc ñoaïn 1 vaø 3 coù nhieàu hôn 1 phaàn
töû thì daõy con ban ñaàu chæ coù thöù töï khi caùc ñoaïn 1, 3
ñöôïc saép.
• Ñeå saép xeáp caùc ñoaïn 1 vaø 3, ta laàn löôït tieán haønh vieäc
phaân hoaïch töøng daõy con theo cuøng phöông phaùp
phaân hoaïch daõy ban ñaàu vöøa trình baøy …
Quick sort – YÙ töôûng
136
Quick sort – Giaûi thuaät
//input: daõy con (a, left, right)
//output: daõy con (a, left, right) ñöôïc saép taêng daàn
• Böôùc 1: Neáu left ≥ right //daõy coù ít hôn 2 phaàn töû
Keát thuùc; //daõy ñaõ ñöôïc saép xeáp
• Böôùc 2: Phaân hoaïch daõy aleft … aright thaønh caùc
ñoaïn: aleft.. aj, aj+1.. ai-1, ai.. Aright
//Ñoaïn 1 ≤ x - Ñoaïn 2: aj+1.. ai-1 = x - Ñoaïn 3: ai.. aright ≥ x
• Böôùc 3: Saép xeáp ñoaïn 1: aleft.. aj
• Böôùc 4: Saép xeáp ñoaïn 3: ai.. aright
137
Quick sort – Phaân hoaïch daõy
//input: daõy con aleft, …, aright
//output: daõy con chia thaønh 3 ñoaïn: ñoaïn 1 ≤ ñoaïn 2 ≤ ñoaïn 3
• Böôùc 1: Choïn tuøy yù moät phaàn töû a[p] trong daõy con laø giaù trò
moác:
x = a[p];
• Böôùc 2: Duyeät töø 2 ñaàu daõy ñeå phaùt hieän vaø hieäu chænh caëp
phaàn töû a[i], a[j] vi phaïm ñieàu kieän
– Böôùc 21: i = left; j = right;
– Böôùc 22: Trong khi (a[i]<x) i++;
– Böôùc 23: Trong khi (a[j]>x) j--;
– Böôùc 24: Neáu i<= j // a[i] ≥ x ≥ a[j] maø a[j] ñöùng sau a[i]
• Hoaùn vò (a[i],a[j]); i++; j--;
– Böôùc 25: Neáu i < j: Laëp laïi Böôùc 22.//chöa xeùt heát maûng
//Heát duyeät
138
Quick sort – Ví duï
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
left right
5X
STOP
Not less than X
i j
STOP
Not greater than X
Phaân hoaïch daõy
139
Quick sort – Ví duï
2 8 5 1 6 12 154
2 3 4 5 6 7 81
left right
5X
STOP
Not less than X
i j
STOP
Not greater than X
Phaân hoaïch daõy
140
Quick sort – Ví duï
2 1 5 8 6 12 154
2 3 4 5 6 7 81
left right
ij
141
6X
Quick sort – Ví duï
2 4 5 8 6 12 151
2 3 4 5 6 7 81
left right
i j
STOP
Not less than X
STOP
Not greater than X
Saép xeáp ñoaïn 3
Phaân hoaïch daõy
142
Quick sort – Ví duï
2 4 5 6 8 12 151
2 3 4 5 6 7 81
left right
ij
Saép xeáp ñoaïn 3
143
2 4 5 6 8 12 151
2 3 4 5 6 7 81
Shell sort – Ví duï
144
Quick sort – Caøi ñaët
void QuickSort(int a[], int left, int right)
{
int i, j, x;
if (left ≥ right) return;
x = a[(left+right)/2]; // choïn phaàn töû giöõa laøm giaù trò moác
i = left; j = right;
while(i < j) {
while(a[i] < x) i++;
while(a[j] > x) j--;
if(i <= j) {
Swap(a[i], a[j]);
i++ ; j--;
}
}
QuickSort(a, left, j);
QuickSort(a, i, right);
}
145
Quick sort – Ñaùnh giaù giaûi thuaät
Nhaän xeùt:
• Veà nguyeân taéc, coù theå choïn giaù trò moác x laø moät phaàn töû
tuøy yù trong daõy, nhöng ñeå ñôn giaûn, phaàn töû coù vò trí
giöõa thöôøng ñöôïc choïn, khi ñoù p = (l +r)/ 2.
• Giaù trò moác x ñöôïc choïn seõ coù taùc ñoäng ñeán hieäu quaû
thöïc hieän thuaät toaùn vì noù quyeát ñònh soá laàn phaân hoaïch.
– Soá laàn phaân hoaïch seõ ít nhaát neáu ta choïn ñöôïc x laø phaàn töû
trung vò (median), nhieàu nhaát neáu x laø cöïc trò cuûa daõy.
– Tuy nhieân do chi phí xaùc ñònh phaàn töû median quaù cao neân trong
thöïc teá ngöôøi ta khoâng choïn phaàn töû naøy maø choïn phaàn töû naèm
chính giöõa daõy laøm moác vôùi hy voïng noù coù theå gaàn vôùi giaù trò
median.
146
Hieäu quaû phuï thuoäc vaøo vieäc choïn giaù trò moác:
– Tröôøng hôïp toát nhaát: moãi laàn phaân hoaïch ñeàu choïn
phaàn töû median laøm moác, khi ñoù daõy ñöôïc phaân chia
thaønh 2 phaàn baèng nhau vaø caàn log2(n) laàn phaân
hoaïch thì saép xeáp xong.
– Neáu moãi laàn phaân hoaïch choïn phaàn töû coù giaù trò cöïc
ñaïi (hay cöïc tieåu) laø moác daõy seõ bò phaân chia
thaønh 2 phaàn khoâng ñeàu: moät phaàn chæ coù 1 phaàn
töû, phaàn coøn laïi goàm (n-1) phaàn töû, do vaäy caàn phaân
hoaïch n laàn môùi saép xeáp xong.
Quick sort – Ñaùnh giaù giaûi thuaät
147
Quick sort – Ñaùnh giaù giaûi thuaät
• Ñoä phöùc taïp thuaät toaùn:
O(N2)Xaáu nhaát
O(NlogN)Trung
bình
O(NlogN)Toát nhaát
Ñoä phöùc taïpTröôøng
hôïp
Sắp xếp theo phương pháp Trộn trực tiếp
Merge Sort
149
Merge sort – YÙ töôûng
• Giaûi thuaät Merge sort saép xeáp daõy a1, a2, ..., an
döïa treân nhaän xeùt sau:
– Moãi daõy a1, a2, ..., an baát kyø laø moät taäp hôïp caùc daõy
con lieân tieáp maø moãi daõy con ñeàu ñaõ coù thöù töï.
• Ví duï: daõy 12, 2, 8, 5, 1, 6, 4, 15 coù theå coi nhö goàm 5 daõy
con khoâng giaûm (12); (2, 8); (5); (1, 6); (4, 15).
– Daõy ñaõ coù thöù töï coi nhö coù 1 daõy con.
Höôùng tieáp caän: tìm caùch laøm giaûm soá
daõy con khoâng giaûm cuûa daõy ban ñaàu.
150
• Caùc vaán ñeà caàn giaûi quyeát:
– Phöông aùn phaân hoaïch daõy ban ñaàu thaønh caùc daõy con.
– Phöông aùn laøm giaûm soá daõy con.
• Phaân hoaïch daõy ban ñaàu thaønh caùc daõy con taêng
daàn:
– Phöông aùn 1: Phaân hoaïch daõy theo caùc ñöôøng chaïy
saép xeáp troän töï nhieân.
– Phöông aùn 2: Phaân hoaïch thaønh caùc daõy con coù soá phaàn
töû baèng nhau (1, 2, 4, …) saép xeáp troän tröïc tieáp.
• Laøm giaûm soá daõy con:
– Caùc daõy con taêng daàn seõ ñöôïc taùch ra 2 daõy phuï theo
nguyeân taéc phaân phoái ñeàu luaân phieân.
– Troän töøng caëp daõy con cuûa hai daõy phuï thaønh moät daõy
con cuûa daõy ban ñaàu daõy môùi coù soá löôïng daõy con
giaûm ñi so vôùi daõy ban ñaàu.
Merge sort – YÙ töôûng
151
//input: daõy (a, N)
//output: daõy (a, N) ñöôïc saép taêng daàn
• Böôùc 1 : k = 1; // daõy con coù 1 phaàn töû laø daõy khoâng
giaûm
• Böôùc 2 : Laëp trong khi (k < N) // daõy coøn hôn 1 daõy
con
– Böôùc 21: Phaân phoái ñeàu luaân phieân daõy a1, a2, …, an thaønh
2 daõy b, c theo töøng nhoùm k phaàn töû lieân tieáp nhau.
//b = a1, …, ak, a2k+1, …, a3k, …
//c = ak+1, …, a2k, a3k+1, …, a4k, …
– Böôùc 22: Troän töøng caëp daõy con goàm k phaàn töû cuûa 2 daõy
b, c vaøo a.
– Böôùc 23: k = k*2;
//Heát laëp
Merge sort – Giaûi thuaät
152
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 1; Phaân phoái ñeàu luaân phieân
153
2 8 5 1 6 4 1512
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 1; Phaân phoái ñeàu luaân phieân
154
2
8
5
1
6
4
15
12
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 1; Troän töøng caëp ñöôøng chaïy
155
2
8
5
1
6
4
15
12
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 1; Troän töøng caëp ñöôøng chaïy
156
12 5 8 1 6 4 152
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 2; Phaân phoái ñeàu luaân phieân
157
5
12
8
1
4
6
15
2
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 2; Troän töøng caëp ñöôøng chaïy
158
5
12
8
1
4
6
15
2
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 2; Troän töøng caëp ñöôøng chaïy
159
5 8 12 1 4 6 152
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 4; Phaân phoái ñeàu luaân phieân
160
1
5
4
8
6
12
15
2
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 4; Troän töøng caëp ñöôøng chaïy
161
1
5
4
8
6
12
15
2
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 4; Troän töøng caëp ñöôøng chaïy
162
2 4 5 6 8 12 151
2 3 4 5 6 7 81
Merge sort – Ví duï
k = 8;
STOP
Only one subarray
163
2 4 5 6 8 12 151
2 3 4 5 6 7 81
Merge sort – Ví duï
164
Merge Sort – Caøi ñaët
• Döõ lieäu hoã trôï: 2 maûng b, c:
int b[MAX], c[MAX], nb, nc;
• Caùc haøm caàn caøi ñaët:
– MergeSort: Saép xeáp maûng (a, N) taêng daàn
void MergeSort(int a[], int N);
– Distribute: Phaân phoái ñeàu luaân phieân caùc daõy con ñoä daøi k töø
maûng a vaøo hai maûng b vaø c
void Distribute(int a[], int N,
int &nb, int &nc, int k);
– Merge: Troän maûng b vaø maûng c vaøo maûng a
void Merge(int a[], int nb, int nc, int k);
– MergeSubarr: Troän 1 caëp daõy con töø b vaø c vaøo a
void MergeSubarr(int a[], int nb, int nc,
int &pa, int &pb, int &pc, int k);
165
Merge sort – Caøi ñaët
//khai baùo 2 maûng phuï
int b[MAX], c[MAX], nb, nc;
void MergeSort(int a[], int N)
{
int k;
for (k = 1; k < N; k *= 2)
{
Distribute(a, N, nb, nc, k);
Merge(a, nb, nc, k);
}
}
166
Merge sort – Caøi ñaët
void Distribute(int a[], int N,
int &nb, int &nc, int k)
{
int i, pa, pb, pc;
pa = pb = pc = 0;
while (pa < N)
{
for (i=0; (pa<N) && (i<k); i++, pa++, pb++)
b[pb] = a[pa];
for (i=0; (pa<N) && (i<k); i++, pa++, pc++)
c[pc] = a[pa];
}
nb = pb; nc = pc;
}
167
Merge sort – Caøi ñaët
void Merge(int a[], int nb, int nc, int k)
{
int pa, pb, pc;
pa = pb = pc = 0;
while ((pb < nb) && (pc < nc))
MergeSubarr(a, nb, nc, pa, pb, pc, k);
while (pb < nb)
a[pa ++] = b[pb ++];
while (pc < nc)
a[pa ++] = c[pc ++];
}
168
Merge sort – Caøi ñaët
void MergeSubarr(int a[], int nb, int nc,
int &pa, int &pb, int &pc, int k)
{
int rb, rc;
rb = min(nb, pb+k); rc = min(nc, pb+k);
while ((pb < rb) && (pc < rc))
if (b[pb] < c[pc])
a[pa ++] = b[pb ++];
else a[pa ++] = c[pc ++];
while (pb < rb)
a[pa ++] = b[pb ++];
while (pc < rc)
a[pa ++] = c[pc ++];
}
169
Merge Sort – Ñaùnh giaù giaûi thuaät
Giaûi thuaät troän tröïc tieáp laø phöông phaùp troän ñôn giaûn
nhaát:
• Vieäc phaân hoaïch thaønh caùc daõy con chæ laø taùch daõy thaønh
caùc daõy con khoâng giaûm ñoä daøi k.
• Ñoä daøi cuûa daõy con laø 1, 2, 4, 8, … ñaûm baûo daõy con luoân laø
daõy con khoâng giaûm sau moãi böôùc taùch - troän.
• Khoâng söû duïng thoâng tin veà thöù töï cuûa daõy ban ñaàu
2 heä quaû:
– Ñoä phöùc taïp thuaät toaùn khoâng phuï thuoäc vaøo daõy ban ñaàu.
– Moät daõy con khoâng giaûm ñang coù saün bò chia nhoû thaønh caùc daõy
khoâng caàn thieát caûi tieán thaønh thuaät toaùn: Troän töï nhieân
(Natural Merge sort).
170
• Soá laàn thöïc hieän vieäc chia luaân phieân vaø troän:
Sau moãi laàn taùch – troän, ñoä daøi K cuûa daõy con
taêng gaáp ñoâi Soá laàn taùch – troän trong
thuaät toaùn: log2n .
• Chi phí thöïc hieän taùch - troän tæ leä thuaän vôùi n.
Chi phí thöïc hieän cuûa giaûi thuaät MergeSort
laø O(nlog2n).
Merge Sort – Ñaùnh giaù giaûi thuaät
171
• Moät nhöôïc ñieåm lôùn nöõa cuûa caùc thuaät toaùn
troän laø khi caøi ñaët thuaät toaùn ñoøi hoûi theâm
khoâng gian boä nhôù ñeå löu caùc daõy phuï b, c.
• Haïn cheá naøy khoù chaáp nhaän trong thöïc teá vì
caùc daõy caàn saép xeáp thöôøng coù kích thöôùc lôùn.
• Vì vaäy thuaät toaùn troän thöôøng ñöôïc duøng ñeå
saép xeáp caùc caáu truùc döõ lieäu khaùc phuø hôïp
hôn nhö danh saùch lieân keát hoaëc file.
Merge Sort – Ñaùnh giaù giaûi thuaät
172
Saép xeáp theo phöông phaùp troän tröïc tieáp Thuaät
toaùn troän töï nhieân Natural Merge sort
• Moät ñöôøng chaïy cuûa daõy soá a laø moät daõy con khoâng
giaûm cuûa cöïc ñaïi cuûa a. Nghóa laø, ñöôøng chaïy
r = (ai, ai+1, …, aj) phaûi thoûa ñieàu kieän:
• Ví duï daõy 12, 2, 8, 5, 1, 6, 4, 15 coù theå coi nhö goàm 5
ñöôøng chaïy (12); (2, 8); (5); (1, 6); (4, 15).
>
<
∈∀≤
+
−
+
1
1
1 ),[
jj
ii
kk
aa
aa
jikaa
173
Saép xeáp theo phöông phaùp troän tröïc tieáp Thuaät
toaùn troän töï nhieân Natural Merge sort
• Thuaät toaùn troän töï nhieân khaùc thuaät toaùn
troän tröïc tieáp ôû choã thay vì luoân cöùng nhaéc
phaân hoaïch theo daõy con coù chieàu daøi k, vieäc
phaân hoaïch seõ theo ñôn vò laø ñöôøng chaïy. ta
chæ caàn bieát soá ñöôøng chaïy cuûa a sau laàn phaân
hoaïch cuoái cuøng laø coù theå bieát thôøi ñieåm döøng
cuûa thuaät toaùn vì daõy ñaõ coù thöù töï laø daõy chi
coù moät ñöôøng chaïy.
174
Saép xeáp theo phöông phaùp troän tröïc tieáp Thuaät
toaùn troän töï nhieân Natural Merge sort
• Böôùc 1 : // Chuaån bò
– r = 0; // r duøng ñeå ñeám soá döôøng chaïy
• Böôùc 2 : Taùch daõy a1, a2, …, an thaønh 2 daõy b, c theo nguyeân
taéc luaân phieân töøng ñöôøng chaïy:
– Böôùc 2.1 :
• Phaân phoái cho b moät ñöôøng chaïy; r = r+1;
• Neáu a coøn phaàn töû chöa phaân phoái
– Phaân phoái cho c moät ñöôøng chaïy; r = r+1;
– Böôùc 2.2 :
• Neáu a coøn phaàn töû: quay laïi böôùc 2.1;
• Böôùc 3 :
– Troän töøng caëp ñöôøng chaïy cuûa 2 daõy b, c vaøo a.
• Böôùc 4 :
– Neáu r <= 2 thì trôû laïi böôùc 2; Ngöôïc laïi: Döøng.
Sắp xếp theo phương pháp Cơ số
Radix Sort
176
Saép xeáp theo phöông phaùp cô soá Radix Sort
• Radix Sort laø moät thuaät toaùn tieáp caän theo moät
höôùng hoaøn toaøn khaùc.
• Neáu nhö trong caùc thuaät toaùn khaùc, cô sôû ñeå saép
xeáp luoân laø vieäc so saùnh giaù trò cuûa 2 phaàn töû thì
Radix Sort laïi döïa treân nguyeân taéc phaân loaïi thö
cuûa böu ñieän. Vì lyù do ñoù Radix Sort coøn coù teân laø
Postman’s sort.
• Radix Sort khoâng heà quan taâm ñeán vieäc so saùnh giaù
trò cuûa phaàn töû maø baûn thaân vieäc phaân loaïi vaø trình
töï phaân loaïi seõ taïo ra thöù töï cho caùc phaàn töû.
177
Saép xeáp theo phöông phaùp cô soá Radix Sort
• Ñeå chuyeån moät khoái löôïng thö lôùn ñeán tay ngöôøi nhaän
ôû nhieàu ñòa phöông khaùc nhau, böu ñieän thöôøng toå
chöùc moät heä thoáng phaân loaïi thö phaân caáp.
• Tröôùc tieân, caùc thö ñeán cuøng moät tænh, thaønh phoá seõ
ñöôïc saép chung vaøo moät loâ ñeå göûi ñeán tænh thaønh töông
öùng.
• Böu ñieän caùc tænh thaønh naøy laïi thöïc hieän coâng vieäc
töông töï. Caùc thö ñeán cuøng moät quaän, huyeän seõ ñöôïc
xeáp vaøo chung moät loâ vaø göûi ñeán quaän, huyeän töông
öùng.
• Cöù nhö vaäy, caùc böùc thö seõ ñöôïc trao ñeán tay ngöôøi
nhaän moät caùch coù heä thoáng maø coâng vieäc saép xeáp thö
khoâng quaù naëng nhoïc.
178
Saép xeáp theo phöông phaùp cô soá Radix Sort
• Moâ phoûng laïi qui trình treân, ñeå saép xeáp daõy
a1, a2, ..., an, giaûi thuaät Radix Sort thöïc hieän
nhö sau:
– Tröôùc tieân, ta coù theå giaû söû moãi phaàn töû ai trong
daõy a1, a2, ..., an laø moät soá nguyeân coù toái ña m chöõ
soá.
– Ta phaân loaïi caùc phaàn töû laàn löôït theo caùc chöõ soá
haøng ñôn vò, haøng chuïc, haøng traêm, … töông töï
vieäc phaân loaïi thö theo tænh thaønh, quaän huyeän,
phöôøng xaõ, ….
179
Saép xeáp theo phöông phaùp cô soá Radix Sort
• Böôùc 1 :// k cho bieát chöõ soá duøng ñeå phaân loaïi hieän
haønh
– k = 0; // k = 0: haøng ñôn vò; k = 1: haøng chuïc; …
• Böôùc 2 : //Taïo caùc loâ chöùa caùc loaïi phaàn töû khaùc
nhau
– Khôûi taïo 10 loâ B0, B1, …, B9 roãng;
• Böôùc 3 :
– For i = 1 .. n do
• Ñaët ai vaøo loâ Bt vôùi t: chöõ soá thöù k cuûa ai;
• Böôùc 3 :
– Noái B0, B1, …, B9 laïi (theo ñuùng trình töï) thaønh a.
• Böôùc 4 :
– k = k+1;Neáu k < m thì trôû laïi böôùc 2. Ngöôïc laïi: Döøng
180
Saép xeáp theo phöông phaùp cô soá Radix Sort
181
Saép xeáp theo phöông phaùp cô soá Radix Sort
182
Saép xeáp theo phöông phaùp cô soá Radix Sort
183
Saép xeáp theo phöông phaùp cô soá Radix Sort
184
Saép xeáp theo phöông phaùp cô soá Radix Sort
185
Saép xeáp theo phöông phaùp cô soá Radix Sort
• Ñaùnh giaù giaûi thuaät:
– Vôùi moät daõy n soá, moãi soá coù toái ña m chöõ soá,
thuaät toaùn thöïc hieän m laàn caùc thao taùc phaân loâ
vaø gheùp loâ.
– Trong thao taùc phaân loâ, moãi phaàn töû chæ ñöôïc xeùt
ñuùng moät laàn, khi gheùp cuõng vaäy.
– Nhö vaäy, chi phí cho vieäc thöïc hieän thuaät toaùn
hieån nhieân laø O(2mn) = O(n).
186
Saép xeáp theo phöông phaùp cô soá Radix Sort
Nhaän xeùt:
– Sau laàn phaân phoái thöù k caùc phaàn töû cuûa A vaøo
caùc loâ B0, B1, …, B9, vaø laáy ngöôïc trôû ra, neáu chæ
xeùt ñeán k+1 chöõ soá cuûa caùc phaàn töû trong A, ta seõ
coù moät maûng taêng daàn nhôø trình töï laáy ra töø 0 →
9. Nhaän xeùt naøy baûo ñaûm tính ñuùng ñaén cuûa thuaät
toaùn.
– Thuaät toaùn coù ñoä phöùc taïp tuyeán tính neân hieäu
quaû khi saép daõy coá raát nhieàu phaàn töû, nhaát laø khi
khoùa saép xeáp khoâng quaù daøi so vôùi soá löôïng phaàn
töû (ñieàu naøy thöôøng gaëp trong thöïc teá).
187
Saép xeáp theo phöông phaùp cô soá Radix Sort
Nhaän xeùt:
– Thuaät toaùn khoâng coù tröôøng hôïp xaáu nhaát vaø toát
nhaát. Moïi daõy soá ñeàu ñöôïc saép vôùi chi phí nhö
nhau neáu chuùng coù cuøng soá phaàn töû vaø caùc khoùa
coù cuøng chieàu daøi.
– Thuaät toaùn caøi ñaët thuaän tieän vôùi caùc maûng vôùi
khoùa saép xeáp laø chuoãi (kyù töï hay soá) hôn laø khoùa
soá nhö trong ví duï do traùnh ñöôïc chi phí laáy caùc
chöõ soá cuûa töøng soá.
188
Saép xeáp theo phöông phaùp cô soá Radix Sort
Nhaän xeùt:
– Soá löôïng loâ lôùn (10 khi duøng soá thaäp phaân, 26 khi
duøng chuoãi kyù töï tieáng Anh, …) nhöng toång kích
thöôùc cuûa taát caû caùc loâ chæ baèng daõy ban ñaàu neân
ta khoâng theå duøng maûng ñeå bieåu dieãn B. Nhö vaäy,
phaûi duøng caáu truùc döõ lieäu ñoäng ñeå bieåu dieãn B
⇒ Radix Sort raát thích hôïp cho saép xeáp treân
danh saùch lieân keát.
189
Saép xeáp theo phöông phaùp cô soá Radix Sort
Nhaän xeùt:
– Ngöôøi ta cuõng duøng phöông phaùp phaân loâ theo
bieåu dieãn nhò phaân cuûa khoùa saép xeáp. Khi ñoù ta
coù theå duøng hoaøn toaøn caáu truùc döõ lieäu maûng ñeå
bieåu dieãn B vì chæ caàn duøng hai loâ B0 vaø B1. Tuy
nhieân, khi ñoù chieàu daøi khoùa seõ lôùn. Khi saép caùc
daõy khoâng nhieàu phaàn töû, thuaät toaùn Radix sort
seõ maát öu theá so vôùi caùc thuaät toaùn khaùc.
190
190
Câu hỏi và thảo luận
Các file đính kèm theo tài liệu này:
- Cơ sở dữ liệu toàn tập.pdf