TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊNKHOA TOÁN – TIN HỌC ----o0o----BÁO CÁO ĐỒ ÁN: TÌM HIỂU, CÀI ĐẶT VÀ BÁO CÁO VỀ CÁC THUẬT TOÁN SEARCH VÀ SORT Giảng viên hướng dẫn: Nguyễn Bảo Long Sinh vê
Trang 1TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA TOÁN – TIN HỌC
o0o BÁO CÁO ĐỒ ÁN:
TÌM HIỂU, CÀI ĐẶT VÀ BÁO CÁO VỀ CÁC THUẬT TOÁN
SEARCH VÀ SORT Giảng viên hướng dẫn: Nguyễn Bảo Long
Sinh vên thực hiện:
Trang 2
Thành phố Hồ Chí Minh, tháng 10 năm 2022
Mục lục
I Phân công công việc: 2
II Thuật toán: 3
1 Linear search 3
2 Binary search 5
3 Selection Sort 6
4 Insertion Sort 7
5 Binary Insertion Sort 8
6 Bubble Sort 10
7 Shaker Sort 12
8 Sell Sort 14
9 Heap Sort 17
10 Merge Sort 19
11 Quick Sort 23
12 Counting Sort 26
13 Radix Sort 27
14 Flash Sort 29
III Nhận xét thời gian thuật toán 38
IV Tài liệu tham khảo: 40
I Phân công công việc:
H2 tên sinh viên Nguy5n Ho6i Linh Hu7nh Thanh H9i
Vi;t b<o c<o, t>m
hi@u thuâ At to<n T>m hi@u thuâ At to<n v6 vi;t b<o c<o vB thuâ At to<n Binary
search, Bubble Sort, Shaker
Sort, Shell
Sort, Merge Sort, Quick Sort,
Flash Sort VC v6 nhâ An xDt
bi@u đF
T>m hi@u thuâ At to<n v6 vi;t b<o c<o vB thuâ At to<n Linear search, Selection Sort, Insertion Sort, Binary Insertion Sort, Heap Sort, Counting Sort, Radix Sort Gom b6i b<o c<o lHi, đInh dHng hJp lK, sLp x;p nô Ai dung b<o c<o
Trang 3Sort, Merge Sort, Quick Sort,
Flash Sort V6 c<c h6m kh<c
cho to6n bô A chương tr>nh
Insertion Sort, Heap Sort, Counting Sort, Radix Sort.MPc đô ho6nA
Tốt nhất 1 gi< trI x.Phần tử đâu tiên của m9ng có
Trung b>nh N;u x<c suất xuất hiện phầntử x trong m9ng T mỗi vI trí
Vậy thực to<n có độ phPc tHp l6 O(n)
Trang 52 Binary search.
S tưTng:
N;u viê Ac t>m ki;m trên m9ng chưa đưJc sLp x;p th> ta chv cóth@ t>m ki;m tuy;n tính từng phần tử mô At trong m9ng Vâ Ay n;u m9ngđ_ sLp x;p th> có c<ch n6o t>m ki;m nhanh hơn không Thực to<nBinary search sC gi9i quy;t vấn đB n6y
Ta bi;t m9ng sLp x;p tăng th> phần tử bên tr<i nhx hơn phần tửbên ph9i Vâ Ay đ@ t>m ki;m 1 phần tử ta chv cyn ki@m tra phần tử gizam9ng lớn hơn, nhx hơn hay bằng phần tử đó N;u nhx hơn th> ta ti;ptục l6m viê Ac đó đối với nửa m9ng bên tr<i, lớn hơn th> với nửa m9ngbên tr<i c{n bằng th> chính l6 vI trí cần tim
M_ gi_:
int left //giới hHn tr<i của m9ng
int right //giới hHn ph9i của m9ng
do
mid = (left + right) / 2
if (x = mid) return mid
if x < a[mid]
right = mid – 1else left = mid + 1
while left <= right
Nhâ An xDt:
Trường hJp Số lần so s<nh bằng Gi9i thích
x
Xấu nhất Gi9 sử x<c suất c<c phần tử trongm9ng nhâ An gi< trI x l6 như nhau
Ví dụ:
Cho d_y số a:
Cho x = 8
Trang 6tử D_y ban đầu có N phần tử, thực hiện N-1 lưJt việc đưa phần tử nhx nhấttrong d_y hiện h6nh vB vI trí đPng đầu d_y.
Trang 7tăng dần nhưng muốnsLp gi9m dần hoặcngưJc lHi th> trườnghJp xấu nhất sC x9y ra
Ví dụ:
Cho d_y số a, n = 7:
12 2 8 5 1 6 4
B1: THi i = 1, a1 = 12, t>m min từ ai đ;n an ta đưJc mIn l6 a4 = 4
B2: Sau đó cho i + 1 v6 ti;p tục thực hiện như bước 1 Thực hiện c<c bước đ;n i
2 phần tử a_k-1 v6 a_k thxa a_k-1<=a_i<=a_k (1<=k<=i)
M_ gi9:
B1: i = 1; // gi9 sử có đoHn a[1] đ_ đưJc sLp
Trang 8B2: x = a[i]; t>m vI trí pos thích hJp trong đoHn a[1] đ;n a[i-1] đ@ chèn v6oa[i]
B3: Dời chỗ c<c phần tử từ a[pos] đ;n a[i-1] sang ph9i 1 vI trí đ@ d6nh chỗcho a[i]
B4: a[pos] = x; // có đoHn a[1] a[i] đ_ đưJc sLp
xộn không ph9i trườnghJp tốt nhất hay xấunhất
x;p theo thP tự tăngdần hay gi9m dầnnhưng ngưJc với yêucầu
- Ví dụ:
Cho d_y số a, n = 7:
12 2 8 5 1 6 4
Trang 95 Binary Insertion Sort.
S tưTng: Binary Insertion Sort l6 một dHng đặc biệt của Insertion Sort sử dụngthuật t>m ki;m nhI phân đ@ t>m ra vI trí chính x<c của phần tử chèn trong m9ng.Thay v> sử dụng phương ph<p t>m ki;m tuy;n tính th> phương ph<p n6y sCdùng t>m ki;m nhI phân đ@ thay th;
M_ gi9: Sử dụng t>m ki;m nhI phân đ@ t>m vI trí cần chèn sao đó thực hiệntương tự như insertion sort
Nhận xDt:
Trường hJp Độ phPc tHp Gi9i thích
to<n binarysearch đHtk;t qu9 tốtnhất
Trung b>nh O(nlog(n)) Khi thuật
to<n binarysearch đHtk;t qu9 trungb>nh
to<n binarysearch đHtk;t qu9 tệ
Trang 10nhất
Trang 12†ng với mỗi lần so s<nh th> sC ho<n vI mô At lần (do m9ng gi9m)nên số lần ho<n vI l6:
Nh>n chung thuâ At to<n không phân biê At m9ng đ_ sLp x;p haychưa L6 thuâ At to<n có hiê Au suất châ Am v6 không thích hJp với c<c dzliê Au lớn Đô A phPc tHp của thuâ At to<n l6: Không gian chí;m dụng: Tính „n đInh: có
Trang 13Thấy 5 < 4 (đúng) thực hiê An ho<n vI J sC dời tới phần tử ti;p theo.Thực hiê An đ;n khi j = i th> dừng T>m đưJc phần tử tương Png tHi i.Ti;p tục so s<nh v6 ho<n vI T c<c vI trí tương Png Ta lần lưJct>m đưJc c<c gi< trI tHi i = 3, 4, … đ;n i = n K;t thúc.
7 Shaker Sort
S tưTng:
L6 thuâ At to<n c9i ti;n của Bubble Sort
Thuâ At to<n duyê At m9ng theo 2 lưJt từ 2 phía kh<c nhau:
- LưJt đi: đˆy phần tử nhx vB đầu m9ng
- LưJt vB: đˆy phần tử lớn vB cuối m9ng
Có sự ghI nhâ An lHi nhzng đoHn đ_ đưJc sLp x;p nhằm ti;t kiê Amnhzng phDp so s<nh
M_ gi9:
left = 1; right = n; //left, right l6 đoHn cần xDt
k = n; //vI trí x9y ra ho<n vI sau cùng
while left < right
for j = right downto left
if a[j] < a[j-1] swap(a[i], a[j-1])
k = j;
left = k;
for j = left in right
if a[j] > a[j-1] swap(a[i], a[j-1])
k = j;
right = k
Trang 14L6 dHng nâng cấp của Bubble Sort nhưng chv nhanh hơn khi
gă Ap m9ng đ_ sLp x;p mô At phần c{n đối với m9ng chưa đưJc sLp x;p,hoă Ac sLp x;p ngưJc th> tốc đô A như Bubble Sort
Đô A phPc tHp của thuâ At to<n l6: Không gian chi;m dụng: Tính
Trang 15Ti;p tục duyê At ngưJc lHi như Bubble Sort.
Thấy sao khi ho<n vI tHi vI trí j = 4 th> xDt j = 3 không có ho<n
vI v6 không c{n ho<n vI n6o nza trong lần duyê At n6y Nên k = 4
Vâ Ay đ@ K ta thấy n;u như b>nh thường sC duyê At ti;p tHi j = 3nhưng bây giờ lHi duyê At tHi j = 4 Đây l6 đi@m kh<c biê At so với BubbleSort chương tr>nh sC nhanh hơn trong trường hJp n6y Duyê At tới right
= 6 Quay chiBu lHi duyê At ti;p
Xong lần duyê At n6y left = right k;t thúc chương tr>nh M9ng đưJc sLpx;p
8 Sell Sort
S tưTng:
SellSort l6 mô At phương ph<p nâng cấp của phương ph<p chèntrực ti;p Thay g> mỗi lần ho<n vI ta gi9m mô At nghIch th;, th> vớiSellSort mỗi lần ho<n vI ta có th@ gi9m nhiBu nghIch th; Bằng c<cht<ch d_y đầu th6nh nhiBu d_y con gFm c<c phần tử T c<ch nhau h vItrí
SLp x;p c<c phần tử của d_y con sC đưa c<c phần tử vB vI tríđúng tương đối mô At c<ch nhanh chóng, sau đó gi9m h đ@ tHo th6nh c<c
Trang 16d_y con mới v6 ti;p tục sLp x;p Thuâ At to<n dừng khi h = 1, khi đó c<cphần tử đ_ đă At đúng vI trí ho6n th6nh viê Ac so s<nh.
Câu hxi T đât l6 ch2n h bao nhiêu th> hJp lK Hiê An nay vyn chưa
có tiêu chuˆn r‰ r6ng trong viê Ac lựa ch2n d_y gi< trI kho9ng c<ch tốtnhất Nhưng ph9i điBu kiê An: v6
Đối với trường hJp tốt nhất, m9ng đưJc sLp x;p l6: t„ng số phDp
so s<nh cho mỗi kho9ng (hoặc kho9ng tăng) bằng kích thước của m9ng.Đối với trường hJp trung b>nh Đô A phúc tHp nằm kho9ng c{n phụthuô Ac v6o kho9ng đưJc ch2n, tr>nh tự gia tăng V6 hiê An tHi vyn có tiêuchuˆn tốt nhất
Đối với trường hJp xấu nhất Đô A phPc tHp nhx hơn hoă Ac bằng Với
đô A phPc tHp c<c phDp so s<nh l6 v6 Đô A phPc tHp số lần ho<n vI
Trang 17Với h = 7: Ta xDt d_y con sau
Nhâ An thấy 12 > 4 => ho<n vI 2 phần tử n6y cho nhau
Ta xDt ti;p với h = 3: Th> c<c d_y con l6
So s<nh v6 ho<n vI lần lưJc từng m9ng con b‹ng thuâ At to<n insertionsort ta đưJc:
Trang 18XDt ti;p h = 1: Ta thực hiê An sLp x;p như insertion sort thu đưJc m9ngđ_ đưJc sLp x;p.
9 Heap Sort
S tưTng: SLp x;p vun đống - heapsort l6 một thuật to<n nhanh sử dụng kỹ thuậtphân loHi dựa trên cấu trúc cây nhI phân đặc biệt g2i l6 đống nhI phân (binaryheap) Thuật to<n dựa v6o sự đặc biệt của cây nhI phân đ@ lựa ch2n ra phần tửlớn nhất rFi lần lưJt chèn phần tử n6y v6o vùng sLp x;p
- ĐInh nghĩa heap: gi9 sử trường hJp sLp x;p tăng dần, khi đó Heap đưJc đInhnghĩa l6 một d_y c<c phần tử a_1, a_2,…, a_r thxa c<c quan hệ với m2i I thuộc[l,r]:
Tính chất 3: M2i d_y a_1, a_l+1,…,a_r với 2l>r l6 một heap
M_ gi9: Gi9i thuật Heapsort tr9i qua hai giai đoHn:
Giai đoHn 1: Hiệu chvnh d_y số ban đầu th6nh heap;
Giai đoHn 2: SLp x;p d_y số dựa trên heap:
Bước 1: Đưa phần tử lớn nhất vB vI trí đừng T cuối d_y:
r = n; ho<n vI(a_1,a_r);
Bước 2: LoHi bx phần tử ra khxi heap: r=r-1; hiệu chvnh phần c{n lHi của d_y
từ a_1, a_2, …, a_r th6nh một heap
Bước 3: N;u r>l (heap c{n phần tử): Lặp lHi Bước 2 NgưJc lHi: Dừng
- Nhận xDt:
Trường hJp Độ phPc tHp thuật to<n Gi9i thích
Trang 19cần liên tục so s<nhphần tử với phần tửcon bên tr<i v6 bênph9i của nó v6 đˆy nóxuống đưới cho đ;nkhi nó đHt đ;n đi@m m6c9 2 phần tử của conđBu nhx hơn nó.
Trang 21Vâ Ay mấu chốt của vấn đB l6 phân hoHch d_y ban đầu th6nh c<cd_y con Thấy d_y luôn gi9m khi chv có 1 phần tử TPc l6 viê Ac phânhHch n6y sC t<ch m9ng th6nh 2 d_y con cho tới khi chv c{n 1 phần tử.Trô An từng că Ap d_y con của hai d_y phụ th6nh mô At d_y con của gi9iban đầu, ta sC nhâ An lHi d_y ban đầu nhưng với số lưJng d_y con ít nhấtgi9m đi mô At nửa Ti;p tục lâ Ap lHi quy tr>nh trên sau mô At số bước, ta sCnhâ An đưJc mô At d_y chv gFm 1 d_y con không gi9m.
Viê Ac phân hoHch n6y chv đơn gi9n l6 t<ch d_y gFm n phần tửth6nh n d_y con Thuâ At to<n n6y đFi hxi tính có thP tự của d_y conluôn đưJc thxa trong c<ch phân hoHch
aux[k]=a[k] // sao chDp dz liê Au d_y chính sang d_y phụ
i = l //vI trí khxi đầu của d_y con 1
j = m + 1 //vI trí khxi đầu của d_y con 2
k = l //vI trí hiê An tHi của d_y mới sau gô Ap
while i <= m and j <= r //dừng khi 1 trong 2 d_y h;t phần tử
Trang 22if aux[i] <= aux[j] a[k++] = aux[i++] //so s<nh phần tửđầu tiên của 2 d_y
else a[k++] = a[j++]
Trang 23ThP tự trô An sC bLt đầu từ 2 phần tử 12, 2 trước Ti;p đ;n l6 phần tử 8,
5 Ta đưJc
Bây giờ ta gô Ap d_y (2, 12) v6 (5, 8) với i = 1, j = 3, k = 2, l = 1, r = 4
Ta so s<nh aux[i] v6 aux[j] thấy 2 < 5 nên a[k]=a[i]
i = 2, k = 2, so s<nh aux[i] v6 aux[j] thấy 5 < 12 nên a[k] = aux[j]
i = 2, k = 3, j = 4 ti;p tục như trên ta đưJc
j = 5 không thxa điBu kiê An, k;t thúc v{ng lă Ap while
Thấy i = 2 vyn thxa điBu kiê An a[k] = aux[i]
Trang 24i = 3 không thxa K;t thúc v{ng lâ Ap K;t thúc h6m.
Theo thP tự đê A quy ta có lần lưJc gô Ap c<c d_y (1), (6) sau đó l6 (1, 6),(4) Tương tự như c<ch l6m trên
Cuối cùng l6 gô Ap d_y (2, 5, 8, 12) v6 (1, 4, 6)
Ta thu đưJc d_y cuối cùng l6 m9ng đ_ sLp x;p
11 Quick Sort
S tưTng:
Đ@ sLp x;p mô At m9ng với n phần tử Ta có th@ phân hoHchm9ng th6nh nhiBu d_y con như merge sort, nhưng kh<c nhau củaquick sort l6 sC ch2n mô At phần tử x bất k7 l6m chốt sau đó ho<n vI c<cphần tử đ@ trước x l6 c<c phần tử nhx hơn x v6 sau x l6 c<c phần tửlớn hơn x
Sau đó thực hiê An phân hoHch ti;p d_y nhx hơn x v6 d_y lớn hơn
x với mô At gi< trI x kh<c Ti;p tục như vâ Ay cho đ;n khi có mô At d_y n6o
đó số lưJng phần tử l6 mô At th> không phân hoHch d_y đó nza Chươngtr>nh sC k;t thúc khi phân hoHch h;t to6n bô A c<c d_y con th6nh mô Atphần tử Hoă Ac mô At d_y c<c phần tử giống nhau
Trang 25while a[i] < x //duyê At từ tr<i sang ph9i khi t>m đưJc phần
tử lớn hơn x th> dừng lHi
i ++ // vI trí của phần tử đówhile a[j] > x //duyê At từ ph9i sang tr<i khi t>m thấy phần
Phân đoHn ho6n h9o
Phân đoHn cân bằng
Phân đoHn cân bằng: Mô At b6i to<n con có kích thước n -–k v6 b6i to<nkia có kich thước l6 k Với k l6 vI trí m6 ta xDt phần tử l6m chốt.Phân đoHn ho6n h9o: phân đoHn luôn thực hiê An dưới dHng phân đôi,mỗi b6i to<n con có kích thước l6 n / 2
Phân đoHn không cân bằng: Mô At b6i to<n đưJc phân ra có kích thước
n - 1 v6 b6i to<n kia có kích thước l6 0 X_y ra khi ch2n phần tử lớnnhất hoă Ac nhx nhất l6m chốt
Trang 26Ho<n vI a[i], a[j]
Ta đưJc 2 d_y con l6
Trang 27Tương tự thực hiê An c<c bước như trên với d_y mô At.
M_ gi9:
B1: T>m ra phần tử lớn nhất (gi9 sử l6 max) từ m9ng đ_ cho
B2: KhTi tHo m9ng count có độ d6i l6 max+1 với tất c9 c<c phần tử bằng 0.B3: Lưu trz số lưJng của từng phần tử tHi chv mục tương Png của chúngtrong m9ng count
Ví dụ: N;u số phần tử của 3 l6 2 th> 2 đưJc lưu T vI trí thP 3 của m9ngcount N;u phần tử 5 không xuất hiện trong m9ng, th> 0 đưJc lưu T vI trí thP 5.B4: Lưu trz t„ng số lưJng của c<c phần tử trong m9ng count Nó sC giúp tađặt chính x<c c<c phần tử v6o chv mục của m9ng đ_ sLp x;p
B5: T>m chv số của từng phần tử của m9ng ban đầu trong m9ng count ĐiBun6y sC cho bi;t số đ;m tích l•y Đặt phần tử tHi chv số đưJc tính
B6: Sau khi đặt mỗi phần tử v6o đúng vI trí của nó, ta sC gi9m số đ;m của nó
đi 1 đơn vI
Nhận xDt:
Trường hJp Độ phPc tHp thuật Gi9i thích
Trang 28bằng 1Trung b>nh O(n+k) (k l6 phHm
vi của c<c phần tử:
phần tử lớn nhất –phần tử nhx nhất)
Phụ thuộc v6ophHm vi k phần tử
Xấu nhất O(n + k), k = n^2 PhHm vi k của
phần tử lớn hơnđ<ng k@ so với c<cphần tử kh<c
Ví dụ:
Cho d_y số a, n = 7:
12 2 8 5 1 6 4
B1: t>m ra phần tử max trong m9ng, max = 12
B2: khTi tHo m9ng phụ count bằng 0 có độ d6i bằng max+1
B3: đ;m số lưJng từng phần tử bằng m9ng phụ count [j] với j l6 a tHi vI trí thP i
Ta đ;m đưJc:
12: 1, 12 lưu T vI trí 7
2: 1, phần tử xuất hiện 2 lần nên đưJc lưu T vI trí 2
8: 1, 8 lưu T vI trí 6
5: 1, tương tự 5 sC đưJc lưu T vI trí 4
1: 1, phần tử xuất hiện 1 lần nên đưJc lưu T vI trí 1
6: 1, 6 đưJc lưu T vI trí 5
4: 1, phần tử 3 không xuất hiện nên 4 sC đưJc lưu T vI trí 3
SLp x;p xong ta đưJc m9ng tăng dần:
1 2 4 5 6 8 12
13 Radix Sort
Trang 29sort Nó không hB quan tâm đ;n việc so s<nh gi< trI của phần tử v6 b9n thânviệc phân loHi tr>nh tự phân loHi sC tHo ra thP tự cho c<c phần tử Trước tiên, ta
có th@ gi9 sử mỗi phần tử a_i trong d_y a_1, a_2,…,a_n l6 một số nguyên có tối
đa m chz số Ta phân loHi c<c phần tử lần lưJt theo c<c chz số h6ng đơn vI,h6ng chục, h6ng trăm,… tương tự việc phân loHi thư theo tvnh th6nh, quậnhuyện, phường x_,…
M_ gi9:
C<c bước thực hiện thuật to<n:
B1: //k cho bi;t chz số dùng đ@ phân loHi hiện h6nh k=0; //k=0: h6ng đơnvI; k=1: h6ng chục;…
B2: //THo c<c lô chPa c<c loHi phần tử kh<c nhau
KhTi tHo 10 lô B_0,B_1,…,B_9 rỗng;
B3: For i=1 n do
Đặt a_i v6o lô B_t với t = chz số thP k của a_i;
B3: Nối B_0, B_1,…,B_9 lHi (theo đúng tr>nh tự) th6nh a
Trang 30L6 thuâ At to<n sLp x;p nâng cấp từ Bucket sort Cho mô At m9ng
có n phần tử th> số lưJng bucket (c<i xô) l6 0.45*n lấy phần nguyên.C<c xô sC đưJc đ<nh số theo thP tự từ 1, 2, 3,
Bây giờ viê Ac cần l6m l6 t>m xem phần tử n6o sC thuô Ac xô thPmấy bằng c<ch lấy gi< trI phần tử đó trừ cho gi< trI nhx nhất chia chokho9ng c<ch giza gi< trI lớn nhất v6 nhx nhất, rFi nhân cho số xô (lấyphần nguyên) t>m đưJc phần tử đó nằm T xô thP mấy V6 số lưJngphần tử của từng xô Index cuối cung của từng xô
Việc n6y sC h>nh th6nh c<c chu tr>nh ho<n vI: mỗi khi ta đemmột phˆn tử T đâu đó đ;n một vI trí n6o đó th> ta ph9i nhấc phần tửhiện tHi đang chi;m chỗ ra, v6 ti;p tục với phần tử bI nhấc ra v6 đưađ;n chỗ kh<c cho đ;n khi quay lHi vI trí ban đầu th> ho6n tất v{ng lặp N;u phần tử đ_ đúng bucket th> xDt đ;n phần tử ti;p theo chođ;n h;t m9ng