1. Trang chủ
  2. » Công Nghệ Thông Tin

Sắp xếp

21 215 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 21
Dung lượng 1,33 MB

Nội dung

Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 15 1. Mc tiêu 2. Kin thc c bn cn có  hc chng này 3. Tài liu tham kho có liên quan n chng 4. Ni dung: II.1 - Bài toán sp xp. II.2 - Các phng pháp sp xp n gin II.3 - Quicksort. II.4 - Heapsort. II.5 - Binsort. 5. Vn  nghiên cu ca trang k tip Trong chng này chúng ta s nghiên cu các vn  sau: · Bài toán sp xp. · Mt s gii thut sp xp n gin. · QuickSort · HeapSort · BinSort II.1- BÀI TOÁN SP XP II.1.1 Tm quan trng ca bài toán sp xp II.1.2 Sp xp trong và sp xp ngoài II.1.3 T chc d liu và ngôn ng cài t II.1.1 Tm quan trng ca bài toán sp xp Sp xp mt danh sách các i tng theo mt th t nào là mt bài toán thng c vn ng trong các ng dng tin hc. Ví d ta cn sp xp danh sách thí sinh theo tên vi th t Alphabet, hoc sp xp danh sách sinh viên theo m trung bình vi th t t cao n thp. Mt ví d khác là khi cn tìm kim mt i tng trong mt danh sách các i tng bng gii thut tìm kim nh phân thì danh sách các i tng này phi c sp xp trc ó. Tóm li sp xp là mt yêu cu không th thiu trong khi thit k các phn mm. II.1.2 Sp xp trong và sp xp ngoài Sp xp trong là s sp xp d liu c t chc trong b nh trong cu máy tính, ó ta có th s dng kh nng truy nhp ngu nhiên ca b nh và do vy s thc hin rt nhanh. Sp xp ngoài là s sp xp c s dng khi s lng i tng c sp xp ln không th u tr trong b nh trong mà phi lu trî trên b nh ngoài. C th là ta s sp xp d liu c lu tr trong các tp tin. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 16 Chng này tp trung gii quyt vn  sp xp trong còn sp xp ngoài sc nghiên cu trong chng IV. II.1.3 T chc d liu và ngôn ng cài t Các i tng cn c sp xp là các mu tin gm mt hoc nhiu trng. Mt trong các trng c gi là khóa (key), kiu ca nó là mt kiu có quan h th t (nh các kiu s nguyên, s thc, chui ký t .). Danh sách các i tng cn sp xp s là mt mng ca các mu tin va nói  trên. Mc ích a vic sp xp là t chc li các mu tin sao cho các khóa ca chúng c sp th t tng ng vi quy lut sp xp.  trình bày các ví d minh ha chúng ta s dùng PASCAL làm ngôn ng th hin và s dng khai báo sau: const N = 100; type KeyType = integer; OtherType = real; RecordType = Record Key : KeyType; OtherFields : OtherType; end; var a : array[1 N] of RecordType; procedure Swap(var x,y:RecordType); var temp : RecordType; begin temp := x; x := y; y := temp; end; n thy rng th tc Swap ly O(1) thi gian vì ch thc hin 3 lnh gán ni tip nhau. II.2- CÁC PHNG PHÁP SP XP N GIN II.2.1- Sp xp chn II.2.2- Sp xp xen II.2.3- Sp xp ni bt Các gii thut n gin thng ly O(n 2 ) thi gian  sp xp n i tng và các gii thut này thng ch dùng  sp các danh sách có ít i tng. Vi mi gii thut chúng ta s nghiên cu các phn: gii thut, ví d, chng trình và phân tích ánh giá. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 17 II.2.1- Sp xp chn (Selection Sort) Gii thut ây là phng pháp sp xp n gin nht c tin hành nh sau: · u tiên chn phn t có khóa nh nht trong n phn t t a[1] n a[n] và hoán v nó i phn t a[1]. · Chn phn t có khóa nh nht trong n-1phn t t a[2] n a[n] và hoán v nó vi a[2]. · Tng quát  bc th i, chn phn t có khoá nh nht trong n-i+1 phn t t a[i] n a[n] và hoán v nó vi a[i]. · Sau n-1 bc này thì mng ã c sp xp. Phng pháp này c gi là phng pháp chn bi vì nó lp li quá trình chn phn t nh nht trong s các phn t cha c sp. Ví d 2-1: Sp xp mng gm 10 mu tin có khóa là các s nguyên: 5, 6, 2, 2, 10, 12, 9, 10, 9 và 3 Khoá c a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban u 5 6 2 2 10 12 9 10 9 3 c 1 2 6 5 2 10 12 9 10 9 3 c 2 2 5 6 10 12 9 10 9 3 c 3 3 6 10 12 9 10 9 5 c 4 5 10 12 9 10 9 6 c 5 6 12 9 10 9 10 c 6 9 12 10 9 10 c 7 9 10 12 10 c 8 10 12 10 c 9 10 12 t qu 2 2 3 5 6 9 9 10 10 12 Hình 2-1: Sp xp chn Chng trình: procedure SelectionSort; var i,j,LowIndex: integer; LowKey: KeyType; begin (1) for i := 1 to n-1 do begin (2) LowIndex := i; (3) LowKey := a[i].key; (4) for j := i+1 to n do (5) if a[j].key < LowKey then Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 18 begin (6) LowKey := a[j].key; (7) LowIndex := j; end; (8) Swap(a[i] , a[LowIndex]); end; end; ánh giá: Phng pháp sp xp chn ly O(n 2 ) sp xp n phn t. Trc ht ta có th tc Swap ly mt hng thi gian nhã nói  mc II.1.3. Các lnh (2), (3) u ly O(1) thi gian. Vòng lp for (4) - (7) thc hin n-i ln, vì j chy t i+1 n n, mi ln ly O(1), nên ly O(n-i) thi gian. Do ó thi gian tng cng là: II.2.2- Sp xp xen (Insertion Sort) Gii thut Trc ht ta xem phn t a[1] là mt dãy ã có th t. · Bc 1, xen phn t a[2] vào danh sách ã có th t a[1] sao cho a[1], a[2] là mt danh sách có th t. · Bc 2, xen phn t a[3] vào danh sách ã có th t a[1], a[2] sao cho a[1], a[2], a[3] là t danh sách có th t. · Tng quát, bc i, xen phn t a[i+1] vào danh sách ã có th t a[1],a[2], a[i] sao cho a[1], a[2], a[i+1] là mt danh sách có th t. · Phn tang xét a[j] sc xen vào v trí thích hp trong danh sách các phn tã c sp trc ó a[1],a[2], a[j-1] bng cách so sánh khoá ca a[j] vi khoá ca a[j-1] ng ngay trc nó. Nu khoá ca a[j] nh hn khoá ca a[j-1] thì hoán i a[j-1] và a[j] cho nhau và tip tc so sánh khoá ca a[j-1] (lúc này a[j-1] cha ni dung ca a[j]) vi khoá ca a[j-2] ng ngay trc nó . Ví d 2-2: Sp xp mng gm 10 mu tin ã cho trong ví d 2-1. Khoá c a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban u 5 6 2 2 10 12 9 10 9 3 c 1 5 6 c 2 2 5 6 c 3 2 2 5 6 c 4 2 2 5 6 10 c 5 2 2 5 6 10 12 Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 19 c 6 2 2 5 6 9 10 12 c 7 2 2 5 6 9 10 10 12 c 8 2 2 5 6 9 9 10 10 12 c 9 2 2 3 5 6 9 9 10 10 12 Hình 2-2: Sp xp xen Chng trình procedure InsertionSort; var i,j: integer; begin {1} for i := 2 to n do begin {2} J := i; {3} while (j>1) and (a[j].key < a[j-1].key) do begin {4} swap(a[j], a[j-1]); {5} j := j-1; end; end; end; ánh giá: Phng pháp sp xp chn ly O(n 2 ) sp xp n phn t. Ta thy các lnh (4) và (5) u ly O(1). Vòng lp (3) chy nhiu nht i-1 ln, mi ln tn O(1) nên (3) ly i-1 thi gian. Lnh (2) và (3) là hai lnh ni tip nhau, lnh (2) ly O(1) nên c hai nh này ly i-1. Vòng lp (1) có i chy t 2 n n nên nu gi T(n) là thi gian  sp n phn t thì ta có II.2.3- Sp xp ni bt (Bubble Sort) Gii thut Chúng ta tng tng rng các mu tin c lu trong mt mng dc, qua quá trình sp, mu tin nào có khóa “nh” sc ni lên trên. Chúng ta duyt tòan mng, t di lên trên. Nu hai phn  cnh nhau mà không úng th t tc là nu phn t “nh hn” li nm di thì phi cho nó “ni lên” bng cách i ch hai phn t này cho nhau. C th là: · Bc 1: Xét các phn t t a[n] n a[2], vi mi phn t a[j], so sánh khoá ca nó vi khoá ca phn t a[j-1] ng ngay trc nó. Nu khoá ca a[j] nh hn khoá ca a[j-1] thì hoán i a[j] và a[j-1] cho nhau. · Bc 2: Xét các phn t t a[n] n a[3], và làm tng t nh trên. · Tng quát  bc th i, ta s xét các phn t t a[n] n a[i+1]. Sau n bc ta thu c mng có th t Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 20 Ví d 2-3: Sp xp mng gm 10 mu tin ã cho trong ví d 2-1. Khoá c a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban u 5 6 2 2 10 12 9 10 9 3 c 1 2 5 6 2 3 10 12 9 10 9 c 2 2 5 6 3 9 10 12 9 10 c 3 3 5 6 9 9 10 12 10 c 4 5 6 9 9 10 10 12 c 5 6 9 9 10 10 12 c 6 9 9 10 10 12 c 7 9 10 10 12 c 8 10 10 12 c 9 10 12 t qu 2 2 3 5 6 9 9 10 10 12 Hình 2-3: Sp xp ni bt Chng trình procedure BubbleSort; var i,j: integer; begin (1) for i := 1 to n-1 do (2) for j := n downto i+1 do (3) if a[j].key < a[j-1].key then (4) Swap(a[j],a[j-1]); end; ánh giá: Phng pháp sp xp ni bt ly O(n 2 ) sp n phn t. Dòng lnh (3) ly mt hng thi gian. Vòng lp (2) thc hin (n-i) bc, mi bc ly O(1) nên ly O(n-i) thi gian. Nh vy i vi toàn b chng trình ta có: II.3- QUICKSORT II.3.1- Ý tng II.3.2- Thit k gii thut II.3.3- Cài t gii thut II.3.4- Thi gian thc hin ca QuickSort Trong phn này chúng ta s nghiên cu mt gii thut sp xp c dùng mt cách ph bin là Quick Sort do A.R. Hoare phát minh vào nm 1960. Quick Sort c ánh giá tt nh vào s phân tích toán hc và các khng nh v kh nng ca nó. Quick Sort ã c ci tin  tr thành phng pháp c chn trong các ng dng sp xp thc t khác nhau. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 21 II.3.1- Ý tng Chúng ta vn xét mng a các mu tin a[1] a[n]. Gi s v là 1 giá tr khóa mà ta gi là cht (pivot). Ta phân hoch dãy a[1] a[n] thành hai mng con "bên trái" và "bên phi". Mng con "bên trái" bao gm các phn t có khóa nh hn cht, mng con "bên phi" bao gm các phn t có khóa ln hn hoc bng cht. Sp xp mng con “bên trái” và mng con “bên phi” thì mng ã cho sc sp bi vì tt c các khóa trong mng con “bên trái “ u nh hn các khóa trong mng con “bên phi”. Vic sp xp các mng con “bên trái” và “bên phi” cng c tin hành bng phng pháp nói trên. Mt mng ch gm mt phn t hoc gm nhiu phn t có khóa bng nhau thì xem nhã có th t. II.3.2- Thit k gii thut n  chn cht Chn khóa ln nht trong hai phn t có khóa khác nhau u tiên k t trái qua. Nu mng ch m mt phn t hay gm nhiu phn t có khóa bng nhau thì không có cht. n  phn hoch  phân hoch mng ta dùng 2 "con nháy" L và R trong ó L t bên trái và R t bên phi, ta cho L chy sang phi cho ti khi gp phn t có khóa  cht và cho R chy sang trái cho ti khi gp phn t có khóa < cht. Ti ch dng ca L và R nu L<R thì hoán v a[L],a[R]. Lp li quá trình dch sang phi, sang trái ca 2 "con nháy" L và R cho n khi L>R. Khi ó L s là m phân hoch, c th là a[L] là phn tu tiên ca mng con “bên phi”. Gii thut QuickSort  sp xp mng a[i] a[j] ta tin hành các bc sau: · Xác nh cht, · Phân hoch mng ã cho thành hai mng con a[i] a[k-1] và a[k] a[j]. · Sp xp mng a[i] a[k-1] ( quy). · Sp xp mng a[k] a[j] ( quy). Quá trình  quy s dng khi không còn tìm thy cht. Ví d 2-4: Ta cn sp mt mng mà khóa là các s nguyên ã c trình bày trong ví d 2-1. Hai phn tu tiên có khóa khác nhau là 5 và 6, ta chn 6 làm cht và tin hành phân hoch mng ban u làm hai mng con và  quy cho hai mng con này. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 22 II.3.3- Cài t gii thut Hàm FindPivot Ta thit k hàm FindPivot  xác nh trong dãy a[i] a[j] xem có hay không hai phn t có khóa khác nhau. Nu không tìm thy hai phn t có khóa khác nhau thì tr v giá tr 0 (không tìm thy cht), ngc li hàm tr v giá tr là ch s ca phn t có khóa ln hn trong hai phn t có khóa khác nhau u tiên. Khóa ln hn này s tr thành phn t cht mà ta s xác nh trong th tc QuickSort.  tin so sánh ta s dng bin FirstKey  lu gi khóa ca phn tu tiên trong mng a[i] a[j] (FirstKey chính là a[i].key). Ta s dùng mt ch s k  dò tìm trong mng a[i] a[j], k t v trí i+1 n ht mng, mt phn  a[k] mà a[k].key <> FirstKey. Nu không tìm thy mt a[k] nh th thì hoc là mng ch gm mt phn t hoc gm nhiu phn t có khóa bng nhau. Trong trng hp ó thì không tìm thy cht và hàm FindPivot s tr v 0. Ngc li ta s phi xét xem a[k].key có ln hn FirstKey hay không, nu úng nh th thì cht s là khóa ca a[k] và hàm FindPivot s tr v k, nu không thì hàm FindPivot s tr v i. Function FindPivot(i,j:integer): integer; var FirstKey : KeyType; k : integer; begin k := i+1; FirstKey := a[i].key; while (k<=j) and (a[k].key = FirstKey) do k:= k+1; if k > j then FindPivot := 0 else if a[k].key > FirstKey then FindPivot := k else FindPivot := i; end; Hàm Partition Hàm Partition nhn vào ba tham s i, j và Pivot  thc hin vic phân hoch theo mng a[i] a[j] theo cht Pivot và tr v giá tr l là ch su tiên ca mng “bên phi”. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 23 Hai con nháy L, R sc s dng  thc hin vic phân hoch nhã trình bày trong phn II.3.2. Function Partition(i,j:integer; pivot :KeyType):integer ; var l,r : integer; begin l := i; {t con nháy L ì bên trái} r := j; {t con nháy R ì bên phi} while l <= r do begin {L tin sang phi} while a[l].key < pivot do l := l+1; {R tin sang trái} while a[r].key >= pivot do r := r-1; if l <r then Swap(a[l],a[r]); end; Partition :=l; end; QuickSort Bây gi chúng ta trình bày th tc cui cùng có tên là QuickSort và chú ý rng  sp xp ng A các record gm n phn t ca kiu Recordtype ta ch cn gi QuickSort(1,n). Ta s s dng bin PivotIndex  lu gi kt qu tr v ca hàm FindPivot, nu bin PivotIndex nhn c mt giá tr khác 0 thì mi tin hành phân hoch mng. Bin Pivot sc s ng  lu gi giá tr cht và bin k  lu gi giá tr ca m phân hoch do hàm Partition tr v. Sau khia ã phân hoch xong ta s gi  quy QuickSort cho mng con “bên trái” a[i] a[k-1] và mng con “bên phi” a[k] a[j]. procedure Quicksort(i,j:integer); var Pivot : KeyType; PivotIndex, k : integer; begin (1) PivotIndex := FindPivot(i,j); (2) if PivotIndex <> 0 then begin (3) Pivot := a[PivotIndex].key; (4) k := Partition(i,j,Pivot); (5) QuickSort(i,k-1); (6) QuickSort(k,j); end; end; II.3.4- Thi gian thc hin ca QuickSort QuickSort ly O(nlogn) thi gian  sp xp n phn t trong trng hp tt nht và O(n 2 ). trong trng hp xu nht. Hàm Partition ly thi gian t l vi s phn t ca mng. Nh vy nu mng có n phn t thì Partition ly P(n)= n n v thi gian. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 24 Gi T(n) là thi gian thc hin ca QuickSort thì T(n) phi là tng ca P(n) và thi gian QuickSort  quy cho hai mng con. Gi s các giá tr khóa ca mng khác nhau. Trong trng hp xu nht là ta luôn chn phi phn t có khóa ln nht làm cht, lúc by gi vic phân hoch b lch tc là mng bên phi ch gm t phn t cht, còn mng bên trái gm n-1 phn t còn li. Khi ó ta có th thành lp phng trình  quy nh sau: Gii phng trình này bng phng pháp truy hi Ta có T(n) = T(n-1) + T(1) +n = T(n-1) + (n+1) = [T(n-2) + T(1) +(n-1)] + (n+1) = T(n-2) + n + (n+1) = [T(n-3) + T(1) +(n-2)] + n + (n+1) = T(n-3) +(n-1) + n + (n+1) . . . . . . . . . . . . . . . . . = T(n-i) + (n-i+2) + (n-i+3) + . + n + (n+1) = T(n-i) + Quá trình trên kt thúc khi i=n-1, khi ó ta có Trong trng hp tt nht khi ta chn c cht sao cho hai mng con có kích thc bng nhau và bng n/2. Lúc ó ta có phng trình  quy nh sau: Gii phng trình  quy này (xem I.4.2) ta c T(n) = O(nlogn). Ngi ta cng chng minh c rng trong trng hp trung bình QuickSort ly T(n) = O(nlogn). II.4- HEAPSORT II.4.1- Heap II.4.2- Ý tng II.4.3- Thit k và cài t gii thut II.4.4- Phân tích HeapSort

Ngày đăng: 29/09/2013, 11:20

Xem thêm

HÌNH ẢNH LIÊN QUAN

Hình 2-2: S px p xen - Sắp xếp
Hình 2 2: S px p xen (Trang 5)
Hình 2-3: S px pn t - Sắp xếp
Hình 2 3: S px pn t (Trang 6)
i nút 2 cho nút 5. Xét li nút 5 thì nó vn úng v trí nên ta c cây mi trong hình 2-9. - Sắp xếp
i nút 2 cho nút 5. Xét li nút 5 thì nó vn úng v trí nên ta c cây mi trong hình 2-9 (Trang 14)
A: array[1..n] of RecordType; - Sắp xếp
array [1..n] of RecordType; (Trang 18)
Hình 2-13 minh ha vi ni hai danh sách. - Sắp xếp
Hình 2 13 minh ha vi ni hai danh sách (Trang 18)
Hình 2-13: S px p theo hai k - Sắp xếp
Hình 2 13: S px p theo hai k (Trang 20)

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w