Môn phân thích thuật toán
MT S THUT TON SP XPBi toánCho mng X cha n s nguyờn: X(1), X(2), ., X(n). Hóy sp xp li mng X theo th t khụng gim.6.1. Sắp xếp chọnThut toỏn ny c gi l thut toỏn sp xp chn hay sp xp tun t .Mụ tInput:Dóy X(1), X(2), , X(n) Output: Dóy X(1), X(2), , X(n) khụng gim;For i = 1 to n 1 X(k) = min { X(i), X(i+1), X(i+2), ., X(n)}; If k > i Then X(k) :=: X(i);Chi tit:For i:=1 to n-1 doa) k:=i; b) For j:=i+1 to n do If X(j)< X(k) then k:=j;c) i_Ch(X(i),X(k));Vớ d: Cn sp xp dóy cú 10 phn t13, 22, 30, 14, 21, 5, 21, 12, 15, 191. min {x1, .,x10 } = 5 = x6. i ch x1 v x6, c:5 , 22, 30, 14, 21, 13 , 21, 12, 15, 192. min {x2, .,x10 } = 12 = x8. i ch x2 v x8, c:5, 12 , 30, 14, 21, 13, 21, 22 , 15, 193. min {x3, .,x10 } = 13 = x6. i ch x3 v x6, c:5, 12, 13 , 14, 21, 30 , 21, 22, 15, 194. min {x4, .,x10 } = 14 = x4. Khụng i ch:5, 12, 13, 14 , 21, 30, 21, 22, 15, 195. min {x5, .,x10 } = 15 = x9. i ch x5 v x9, c:5, 12, 13, 14, 15 , 30, 21, 22, 21 , 196. min {x6, .,x10 } = 19 = x10. i ch x6 v x10, c:5, 12, 13, 14, 15, 19, 21, 22, 21, 307. min {x7, .,x10 } = 21 = x7. Khụng i ch:5, 12, 13, 14, 15, 19, 21 , 22, 21, 308. min {x8, .,x10 } = 21 = x9. i ch x8 v x9, c:1 5, 12, 13, 14, 15, 19, 21, 21 , 22 , 309. min {x9, x10 } = 22 = x9. Không đổi chỗ:5, 12, 13, 14, 15, 19, 21, 21, 22 , 306.2. S¾p xếp chÌn 1) Giả sử có phần đầu của mảng là B(i-1) = { X(1), .,X(i-1) } đã được sắp xếp không giảm. Trong mọi trường hợp, luôn có thể coi B(1) = { X(1) } là đã được sắp xếp không giảm.2) Kiểm tra đến phần tử X(i); Tìm vị trí thích hợp của X(i) trong dãy B(i-1) và chèn X(i) vào vị trí để được dãy B(i) = {X(1), .,X(i-1), X(i) } không giảm.3) Sau bước 2) dãy mới B(i) = { X'(1), .,X'(i-1),X'(i) } cũng không giảm;4) Lặp lại thủ tục trên với X(i+1), . cho đến khi i = n;Nhận xét:− Bước 1) có thể bắt đầu với B(1):= { X(1) }− Kỹ thuật tìm vị trí “thích hợp” của X(i) trong dãy B(i-1) và chèn X(i) vào vị trí để có thể được thực hiện như sau: • Lưu giá trị của X(i) vào một biến tg;• So sánh giá trị của biến tg với các phần tử của B(i-1), bắt đầu từ X(i-1). Nếu tg < X(i-1) thì i không phải là chỗ của X(i), gán X(i):=X(i-1); • Tiếp tục so sánh tg với X(i-2); nếu tg < X(i-2) thì i-1 chưa phải là chỗ của X(i). Gán X(i-1):=X(i-2). Các thao tác này nhằm chuẩn bị chỗ cho X(i) sau này.• Tiếp tục quá trình trên cho đến khi gặp j đầu tiên mà tg > X(j) thì dừng lại: Vị trí của tg là j+1. Thực hiện phép gán X(j+1) := tg;Ví dụ, xét dãy 1 2 3 4 5 6 7 8 9 10 11X = 1, 3, 5, 7, 8, 9, 12, 4, 5, 6, 2 B(7) = <1, 3, 5, 7, 8, 9, 12> ,Xét i = 8, Đặt j = i-1 = 7Đổi dần tg = 4 lùi về phía trước; sau các bước X = 1, 3, 5, 7, 8, 9, 12 , 12, 5, 6, 2,j=6 X = 1, 3, 5, 7, 8, 9 , 9, 12, 5, 6, 2,j=5 X = 1, 3, 5, 7, 8 , 8, 9, 12, 5, 6, 2,j=42 X = 1, 3, 5, 7 , 7, 8, 9, 12, 5, 6, 2,j=3 X = 1, 3, 5 , 5, 7, 8, 9, 12, 5, 6, 2,j=2Tại bước này j=2. Gán X(j+1) := tg => X(3) = 4. Kết quả: X = 1, 3, 4, 5, 7, 8, 9, 12, 5, 6, 2Input:Dãy X(1), X(2), , X(n)Output: Dãy X(1), X(2), , X(n) không giảm;Chi tiết:− Bắt đầu với B(1) = { X(1) };− Xây dựng các B(i) với i = 2,3, .n như sau:For i:=2 to n do1) tg := X(i);2) j := i - 1;3) While (tg < X(j)) and (j>0) doa) X(j+1):= X(j);b) j := j-1;4) X(j+1):=tg;6.3. S¾p xếp nổi bät (Bubble Sort) Về cơ bản thuật toán sắp xếp nổi bọt gần giống với thuật toán sắp xếp tuần tự. Điểm khác biệt là ở chỗ trong mỗi bước lặp để tìm giá trị min trong dãy X(i), X(i+1), X(i+2), ., X(n) là xuất phát từ dưới lên, so sánh từng cặp một, nếu phần tử đứng dưới X(j+1) mà nhỏ hơn so với phần tử đứng trên X(j) thì đổi chỗ chúng cho nhau.Với i=1 đến n -1Với j=n đến i+1 nếu X(j) < X(j-1) thì đổi chỗ ( X(j), X(j-1) ) Dãy X(1), ., X(n) đã được sắp xếp không giảm.Ví dụ: Cần sắp xếp dãy có 10 phần tử13, 22, 30, 14, 21, 5, 21, 12, 15, 19i = 113 22 30 14 21 5 21 12 15 1913 22 30 14 21 5 12 21 15 1913 22 30 14 5 21 21 12 15 1913 22 30 5 14 21 21 12 15 1913 22 5 30 14 21 21 12 15 193 13 5 22 30 14 21 21 12 15 195 13 22 30 14 21 21 12 15 19i = 25 12 13 22 30 14 21 21 15 19i = 35 12 13 14 22 30 15 21 21 19i = 45 12 13 14 15 22 30 19 21 21i = 55 12 13 14 15 19 22 30 21 21i = 65 12 13 14 15 19 21 22 30 21i = 75 12 13 14 15 19 21 21 22 30i = 8Không thay đổi5 12 13 14 15 19 21 21 22 30i = 9Không thay đổi5 12 13 14 15 19 21 21 22 306.4. S¾p xếp ph©n đo¹n (QuickSort) 1. Chọn một phần tử X(0,i) nào đó làm khoá;Xếp - các phần tử nhỏ hơn khoá ở phía trước (so với khoá), được đoạn B(1); - các phần tử lớn hơn khoá ở phía sau (so với khoá), được đoạn B(2);bằng cách so sánh các phần tử này với chốt và đổi chỗ của chúng cho nhau hoặc với khoá nếu cần thiết.Kết quả được dãy < B(1), X(0,i), B(2) >2. Tiếp tục thực hiện thủ tục trên với hai đoạn B(1) và B(2); Kết quả được hai dãy con là< B(1,1), X(1,i), B(1,2) > và < B(2,1), X(2,i), B(2,2) >Dãy X được xếp lại là< B(1,1), X(1,i), B(1,2), X(0,i), B(2,1), X(2,i), B(2,2) >4 Nhận xét: Nếu mỗi đoạn con trong các đoạn B(1,1), B(1,2), B(2,1), B(2,2) được sắp thì X là một dãy không giảm.3. Lặp lại thủ tục trên với các dãy con B(1,1) , B(1,2), B(2,1) và B(2,2).Ví dụ:Xét dãy X= <2, 1, -3, 4, 7, -6, 5, -8, 9, 8 >Chỉ số: 1 2 3 45 6 7 8 9 10 key = 2Chọn key X(1) = 2Chọn hai phần tử cần đổi chỗ cho nhaui:=2; j:= 10;While key > X(i) Do i:=i+1;Tại chỉ số i: key ≤ X(i); i = 4While key < X(j) Do j:=j-1;Tại chỉ số j: key ≥ X(j);j = 82, 1, -3, 4, 7, -6, 5, -8, 9, 8 i j Đổi chỗ X(i) và X(j) 2, 1, -3, -8, 7, -6, 5, 4, 9, 8Lặp lại thủ tục trên: tăng i trước, cố định j sau đó mới tăng j: i<ji = 5, j=62, 1, -3, -8, 7, -6, 5, 4, 9, 8 i jĐổi chỗ X(i) và X(j), kết quả: 2, 1, -3, -8, -6, 7, 5, 4, 9, 8If i=j-1 then Đổi_chỗ( key,X(i)):-6, 1, -3, -8, 2, 7, 5, 4, 9, 8Có 2 đoạn <-6,1,-3, -8>, <2>, <7, 5,4, 9,8>Lượt thứ 2:a) Xét đoạn con B(2) := < 7, 5, 4, 9, 8 >Chọn key X(1) = 7Chọn hai phần tử cần đổi chỗ cho nhaui:=2; j:= 5;While key > X(i) Do i:=i+1;Tại chỉ số i: key ≤ X(i); i = 45 While key < X(j) Do j:=j-1;Tại chỉ số j: key ≥ X(j); i ≥ jj = 37, 5, 4, 9, 8 j i Do i ≥ j không đổi chỗ X(i) và X(j) mà đổi chỗ key và X(j):4, 5, 7, 9, 8Chi tiết mức 1:Xem xét đoạn X(l) . X(r);+ Nếu l>=r thì ngừng việc xem xét;+ Nếu l<r thì xem xét tiếp:1. Chọn key := X(l);2. Đặt i:=l+1; j:=r;3. While X(i) > key do i := i+1;4. While key < X(j) do j := j -1;5. Nếu i<j thì + Đổi_chỗ(X(i) và X(j));+ Quay lên 3. và tiếp tục; Ngược lại, nếu i>=j thì kết thúc vòng lặp;6. Đổi chỗ key = X(l) và X(j)7. Xem xét đoạn X(l) . X(j-1);8. Xem xét đoạn X(j+1) . X(r);Chi tiết mức 2:Procedure SXN(L,R:integer);If L<R then Begin key:=x[L]; i := L+1; j := R; While i<=j Do while x[i]<=key do i:=i+1; while x[j]>key Do j:=j-1; If i<j then Doi_cho(x[i],x[j]);Doi_cho(x[L],x[j]); SXN(L,j-1); SXN(j+1,R); End;Kí hiệu - T(k) là số phép toán cần thực hiện để sắp xếp dãy có độ dài k: X(l r), r=l+k-1;- P(k) là số phép toán cần thiết để phân đoạn dãy có độ dài k thành 2 đoạn con;6 - Hin nhiờn T(k) = P(k) + T(j-l)+T(r-j);- ý rng P(k) = c.k vi c l mt hng s dng no ú. Tht vy, s phộp toỏn so sỏnh l 2k; S phộp toỏn cng v tr l k; S phộp toỏn hoỏn v 3k/2; (õy l s phộp toỏn cc i); vy tng s phộp toỏn cú th lờn ti 9k/2; (hng s c=9/2);- Suy ra T(k) = c.k + T(j-l) + T(r-j) - Ta cú th chng minh c rng T(j-l) + T(r-j) T(0) + T(k-1). Cú ngha l trng hp xu nht l cú mt tp trng. Khi y T(0)=0, T(k-1) c.(k-1) + T(k-2). Suy raT(k) c( k + (k-1) + . + 1) = c. k(k+1)/2. Hay núi cỏch khỏc, thut toỏn sp xp nhanh cú phc tp O(n2), cú ngha l khụng khỏc gỡ cỏc thut toỏn sp xp khỏc. Tuy nhiờn, nu ch s j nm chớnh gia, núi cỏch khỏc on X(l r) luụn luụn c chia ụi thỡ khi y s phộp toỏn l O(nlog2n), tng t nh thut toỏn tỡm kim nh phõn.6.5. Sắp xếp hoà nhập (Merge Sort)6.5.1. Th tc ho nhp hai mng ó spBi toỏn 1: Cho hai mng ó c spX = <X(1), ., X(m) > v Y = < Y(1), ., Y(n) > To mng Z =<Z(1), ., Z(m+n)> cú th t t 2 mng X v Y.Mụ t thut toỏn ho nhp 1 ( HN1):í tng:1) So sỏnh hai phn t nh nht ca hai mng; a phn t nh hn ra mng ớch. Loi b phn t c chn ny ra khi mng ang cha nú.2) Lp li th tc ny cho n khi vột ht mt trong hai mng.3) Chuyn ton b phn uụi ca mng cũn li ra mng ớch.Chi tit:1) i:=1; j:=1; k:=1;2) While (i m) & (j n) a) If X[i] < Y[j] then { Z[k]:=X[i]; inc(i) };else { Z[k]:=X[j]; inc(j) };b) Inc(k);3) If i > m then for t:=j to n do Z[k+t-j] := Y[t]else for t:=i to m do Z[k+t-i] := X[t];Bi toỏn 2: Cho mng X gm hai phn ó c sp xp riờng bit cựng th t (khụng tng hoc khụng gim):7 <X(p), ., X(m)> và < X(m+1), ., X(n)>Tạo mảng Z=<Z(p), ., Z(n)> có thứ tự từ hai phần đã được sắp của mảng X.Mô tả thuật toán hoà nhập 2 (HN2):Ý tưởng:1) So sánh hai phần tử nhỏ nhất của hai phần mảng X và đưa phần tử nhỏ hơn ra mảng đích Z. Lướt qua phần tử được chọn này trong phần mảng đang chứa nó.2) Lặp lại thủ tục này cho đến khi vét hết một trong hai phần của mảng.3) Chuyển toàn bộ phần cuối còn lại của mảng ra mảng đích. Chi tiết HN2(X:mảng vào;p,m,n:integer; Z: mảng ra):1) i:=p; j:=m; k:=p;2) While (i ≤ m) & (j ≤ n) a) If X[i] < X[j] then { Z[k]:=X[i]; inc(i); };else { Z[k]:=X[j]; inc(j); };b.) Inc(k);3) If i > m then for t:=j to n do Z[t] := X[t]else for t:=i to m do Z[n-m+t] := X[t];6.5.2. Thủ tục sắp xếp mảng dựa vào thủ tục hoà nhậpBài toán: Cho hai mảng X = <X(1), ., X(n)> Cho phép sử dụng thêm mảng Y =<Y(1), ., Y(n)> để sắp xếp X.Mô tả thuật toánÝ tưởng:+ Xét đoạn X(left), ,X(right) tuỳ ý trong đoạn <X(1), ., X(n)>+ Chia mảng X(left), .,X(right) ra làm 2 phần sao cho lệch nhau ít nhất;+ Sắp xếp từng phần X(left) , .X(m) và X(m+1), .,X(right);+ Sử dụng thủ tục hoà nhập 2 để trộn hai phần đã được sắp xếp này.Chi tiết:Xét đoạn X(left), ,X(right)1) Nếu left < right thì a) Chia đoạn trên làm 2 phần theo mốc m:=(left+right)/2;b) Sắp xếp các đoạn X(left), ., X(m) và X(m+1), ., X(right);c) Lưu 2 phần “đã sắp” này vào mảng Y:+ Y(left .m) :=X(left .m);8 + Y(m+1 .) :=X(m+1 .right);d.) Ho nhp 2 phn ca mng Y l Y(left .m) v Y(m+1 right) vo mng X(left .right);Vit li: Procedure Merge(X(left right));If left < right then a) m:= (left + right) div 2;b) Merge(left, m); Merge(m+1, right);c) For i:= left to right do Y(i)] := X(i);d) HN2(Y,left,m,right,X); Bi tp: ỏnh giỏ thut toỏn sp xp ny. ỏp s O(nlog2n);6.6. Sp xp vun ng (Heap Sort)1. To ngMt cõy nh phõn T cú chiu cao d m mi nỳt c gỏn mt giỏ tr khoỏ c gi l ng nu tho món cỏc iu kin sau õy:a) Cõy T cú 2k nỳt ở mc k, vi 1 k d-1. ở mc d-1 cỏc lỏ u nm bờn phi ca cỏc nỳt trong. Nỳt trong bờn phi nht mc d-1 cú th cú bc 1 (khụng cú con phi); cũn cỏc nỳt khỏc cú bc 2.b) Khoỏ ca mi nỳt ln hn hoc bng khoỏ cỏc nỳt con ca nú (nu nú cú con).Nu cõy T ch tho món iu kin a) ta s tm gi l cõy T cú cu trỳc ng.2. Chin lc sp xp vun ngGi thit mng X cn sp xp cú n phn t v mi phn t cú mt khoỏ dựng sp xp. For i:=1 to n- Copy khoỏ t gc vo mng;- Chuyn phn t bờn phi nht ca mc thp nht (sau cùng) ca cu trỳc ng, ghi li phn t ny;- Sp xp li cỏc nỳt theo khoỏ (bao gm c nỳt va b xoỏ nhng khụng k nỳt gc) thit lp li ng.9 Ta xét một bước của vòng lặp sắp xếp (làm lại đống). Giá trị của khoá tạo gốc (root) của cây ở bước đầu tiên bằng 50. Giá trị này được ký hiệu là max. Sau khi loại bỏ giá trị này, cây được sắp xếp lại (rearrange) để thành đống. Quá trình này được thực hiện dần dần bằng cách tạo ra các “khoảng trống” di chuyển dần theo các mức xuống thấp, cho đến khi chạm đáy (mức d-1). + ở bước 4 ghi key = 6 vào ô có khoảng trống được tạo ra sau cïng.+ Trong bước 5 giá trị max = 50 được lưu lại trong bước trước sẽ ghi vào ô 10 [...]... đống trong các bước tiếp theo Như vậy, ta có thể thấy được phần quan trọng nhất trong thuật toán này là sắp lại trên một cây dạng “gần” đống , tức là vốn là một đống nhưng bị đảo một thứ tự ở một chỗ nào đó, hoặc các cây con của nó vốn đã là một đống, thành một đống Ta sẽ gọi thuật toán này là Fix_heap Xét thuật toán FixHeap Input: Chỉ số root và giá trị key Output: Đống với các khoá được sắp xếp... (X[j]10) cho nên kết thúc vòng lặp; 6 Gán key làm khoá ô k_trống 30 24 18 20 21 6 3 12 5 7 Gán giá trị max vào ô 10 (ô có key ở đoạn trên) 30 24 18 20 21 6 3 12 5 6 50 Để hiểu rõ hơn một bước lớn của thuật toán HeapSort ta xét bước tiếp theo: 1 max := 30; 2 Chỉ số ô có khoá so sánh key là 9; 3 Khoá so sánh key := 5 là giá trị x(9); 3 Chỉ số ô k_trống k:= 1; 24 18 20 21 6 3 12 5 50 5 Vòng lặp xác định . Da_xong :=true; End;X[k] := Key;End;3. Thuật toán HeapSortTrước khi xét thuật toán HeapSort ta hãy xét thuật toán tạo đống ban đầu. Ý tưởng chính của. của nó vốn đã là một đống, thành một đống . Ta sẽ gọi thuật toán này là Fix_heap.Xét thuật toán FixHeapInput: Chỉ số root và giá trị keyOutput: Đống