Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 83 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
83
Dung lượng
3,24 MB
Nội dung
25 25 Khái niệm nghòch thế • Khái niệm nghòch thế: – Xét một mảng các số a 0 , a 1 , … a n . – Nếu có i<j và a i > a j , thì ta gọi đó là một nghòch thế. • Mảng chưa sắpxếp sẽ có nghòch thế. • Mảng đã có thứ tự sẽ không chứa nghòch thế. a 0 ≤ ≤≤ ≤ a 1 ≤ ≤≤ ≤ … ≤ ≤≤ ≤ a n 26 26 Cácphươngphápsắpxếpthôngdụ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 gia û û n, n, Chi ph Chi ph í í cao cao Ph Ph ứ ứ c ta c ta ï ï p hơn p hơn Hie Hie ä ä u qua u qua û û cao cao Lơ Lơ ù ù p thua p thua ä ä t toa t toa ù ù n n kha kha ù ù c c 27 27 Selection sort – Ý tưởng • Nhận xét: Mảng có thứ tự thì a i = min(a i , a i+1 , …, a n-1 ) Ý tưởng: mô phỏng một trong những cách sắpxếp tự nhiên nhất trong thực tế: – Chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử này về vò trí đúng là đầu dãy hiện hành – Xem dãy hiện hành chỉ còn N-1 phần tử của dãy ban đầu, bắt đầu từ vò trí thứ 2; lặp lại quá trình trên cho dãy hiện hành . đến khi dãy hiện hành chỉ còn 1 phần tử. 28 28 Selection sort – Thuật toán //input: dãy (a, N) //output: dãy (a, N) đã được sắpxếp • Bước 1 : i = Vò trí đầu; • Bước 2 : Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[N] • Bước 3 : Nếu min ≠ ≠≠ ≠ i: Hoán vò a[min] và a[i] • Bước 4 : Nếu i chưa là Vò trí cuối » i = Vò trí kế(i); » Lặp lại Bước 2 Ngược lại: Dừng. //N phần tử đã nằm đúng vò trí. 29 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(a i , a min ) 30 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(a i , a min ) 31 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(a i , a min ) 32 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(a i , a min ) 33 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(a i , a min ) 34 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(a i , a min ) 35 35 Selection sort – Ví dụ 2 4 5 6 8 12 151 i min 2 3 4 5 6 7 81 Find MinPos(7, 8) Swap(a i , a min ) 12 15 36 36 Selection sort void SelectionSort(int a[],int N ) { int min; // chỉ số phần tử nhỏ nhất trong dãy hiện hà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 nhận vò trí phần tử nhỏ nhất if (min != i) Swap(a[min], a[i]); } } 37 37 • Số lần hoán vò (một hoán vò bằng 3 phép gán) phụ thuộc vào tình trạng ban đầu của dãy số Selection sort – Đánh giá giải thuật 38 38 Selection sort – Đánh giá giải thuật • Ởû lượt thứ i, cần (N-i) lần so sánh để xác đònh phần tử nhỏ nhất hiện hành. • Số lượng phép so sánh không phụ thuộc vào tình trạng của dãy số ban đầu. • Trong mọi trường hợp, số lần so sánh là: 2 1)n(n i)(n 1n 1i − =− ∑ − = 39 39 Insertion Sort – Ý tưởng • Nhận xét: mọi dãy a 1 , a 2 , ., a n luôn có i-1 phần tử đầu tiên a 1 , a 2 , . ,a i-1 đã có thứ tự (2 ≤ i). Ý tưởng chính: tìm cách chèn phần tử a i vào vò trí thích hợp của đoạn đã được sắp để có dãy mới a 1 , a 2 , . ,a i trở nên có thứ tự. – Vò trí này chính là pos thỏa a pos-1 ≤ a i < a pos (1≤ ≤≤ ≤pos≤ ≤≤ ≤i). Chi tiết hơn: – Dãy ban đầu a 1 , a 2 , ., a n , xem như đã có đoạn gồm một phần tử a 1 đã được sắp. – Thêm a 2 vào đoạn a 1 sẽ có đoạn a 1 a 2 được sắp – Thêm a 3 vào đoạn a 1 a 2 để có đoạn a 1 a 2 a 3 được sắp – Tiếp tục cho đến khi thêm xong a N vào đoạn a 1 a 2 . a N-1 sẽ có dãy a 1 a 2 a N được sắp. 40 40 Insertion Sort – Thuật toán //input: dãy (a, N) //output: dãy (a, N) đã được sắpxếp • Bước 1 : i = 2; // giả sử có đoạn a[1] đã được sắp • Bước 2 : x = a[i]; Tìm vò trí pos thích hợp trong đoạn a[1] đến a[i] để chèn x vào • Bước 3 : Dời chỗ các phần tử từ a[pos] đến a[i-1] sang phải 1 vò trí để dành chổ cho x • Bước 4 : a[pos] = x; // có đoạn a[1] a[i] đã được sắp • Bước 5 : i = i+1; Nếu i ≤ ≤≤ ≤ n : Lặp lại Bước 2. Ngược lại : Dừng. 41 41 Insertion Sort – Ví duï 2 8 5 1 6 4 1512 2 3 4 5 6 7 81 42 42 2 8 5 1 6 4 1512 i x 2 3 4 5 6 7 81 pos 2 Insertion Sort – Ví duï Insert a 2 into (1, 2) 43 43 12 8 5 1 6 4 152 i x 2 3 4 5 6 7 81 pos Insertion Sort – Ví duï Insert a 3 into (1, 3) 8 44 44 8 12 5 1 6 4 152 i x 2 3 4 5 6 7 81 pos Insertion Sort – Ví duï Insert a 4 into (1, 4) 5 [...]... bớt các phần tử đã có thứ tự ở cuối dãy • Bước 3 : Nếu l < r: Lặp lại Bước 2 79 Sắpxếp cây - Heap sort • Khi tìm phần tử nhỏ nhất ở bước i, phương phápsắpxếp chọn trực tiếp không tận dụng được cácthông tin đã có được do các phép so sánh ở bước i-1 • Giải thuật Heap Sort khắc phục nhược điểm này bằng cách chọn ra được một cấu trúc dữ liệu cho phép tích lũy cácthông tin về sự so sánh giá trò các. .. heap và phương phápsắpxếp Heapsort do J.Williams đề xuất đã giải quyết được các khó khăn trên 85 Sắpxếp cây - Heap sort • Đònh nghóa heap: – Heap là một dãy các phần tử aleft, aleft+1, , aright thoả các quan hệ: • ai ≥ a2i • ai ≥ a2i+1 với ∀i ∈ [left, right] – Khi đó (ai , a2i), (ai ,a2i+1) được gọi là các cặp phần tử liên đới – Heap được đònh nghóa như trên được dùng trong trường hợp sắpxếp tăng... tắc đổi chỗ trực tiếp – Tìm cách khắc phục các nhược điểm của BubleSort • Trong mỗi lần sắp xếp, duyệt mảng theo 2 lượt từ 2 phía khác nhau : – Lượt đi: đẩy phần tử nhỏ về đầu mảng – Lượt về: đẩy phần tử lớn về cuối mảng • Ghi nhận lại những đoạn đã sắpxếp nhằm tiết kiệm các phép so sánh thừa 77 Giải thuật ShakerSort //input: dãy (a, N) //output: dãy (a, N) đã được sắpxếp • Bước 1 : – l = 1; r =... liên đới – Heap được đònh nghóa như trên được dùng trong trường hợp sắpxếp tăng dần, khi sắpxếp giảm dần phải đổi chiều các quan hệ 86 Ví dụ dãy là heap: 1 2 3 4 5 6 7 8 15 12 8 5 1 4 6 2 87 Sắpxếp cây – Heap sort a1 a2 a4 Các phần tử của dãy được biểu diễn theo các mối quan hệ liên đới a3 a5 a6 a7 a8 88 Sắpxếp cây - Heap sort • Một số tính chất của Heap: – Tính chất 1: Nếu aleft, aleft+1, …, aright... việc cập nhật cây chỉ xảy ra trên những nhánh liên quan đến phần tử mới loại bỏ, còn các nhánh khác được bảo toàn, nghóa là bước kế tiếp có thể sử dụng lại các kết quả so sánh ở bước hiện tại 82 Sắpxếp cây - Heap sort • Loại bỏ 8 ra khỏi cây và thế vào các chỗ trống giá trò -∞ để tiện việc cập nhật lại cây : ∞ 83 Sắpxếp cây - Heap sort • Toàn bộ nhánh trái của cây cũ được bảo toàn ⇒ Bước kế tiếp để... cần làm thêm một phép so sánh 1 với 6 84 Sắp xếp cây - Heap sort • Tiến hành nhiều lần việc loại bỏ phần tử gốc của cây cho đến khi tất cả các phần tử của cây đều là ∞, khi đó xếpcác phần tử theo thứ tự loại bỏ trên cây sẽ có dãy đã sắp xếp • Để cài đặt thuật toán hiệu quả, cần phải tổ chức một cấu trúc lưu trữ dữ liệu có khả năng thể hiện được quan hệ của các phần tử trong cây với n ô nhớ thay vì... aleft+1, , aright thỏa: 2left > right đều là heap 89 Ví dụ các tính chất của heap: 1 2 3 4 5 6 7 8 15 12 8 5 1 6 4 2 12 8 5 1 6 4 1 6 4 2 90 Sắpxếp cây - Heap sort • Sắpxếp dãy tăng dần qua 2 giai đoạn: – Giai đoạn 1: Dựa vào tính chất 3 của heap để hiệu chỉnh dãy ban đầu thành heap – Giai đoạn 2: Dựa vào các tính chất 1 và 2 của heap để sắpxếp heap có được sau giai đoạn 1 thành dãy tăng dần 91 Heap... hợp như sau: 53 Phươngpháp đ i ch tr c ti p Interchange Sort Interchange Sort – Ý tưởng • Nhận xét: Để sắpxếp một dãy số, ta có thể xét các nghòch thế có trong dãy và làm triệt tiêu dần chúng đi Ý tưởng chính: – Xuất phát từ đầu dãy, tìm tất cả nghòch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chỗ phần tử này với phần tử tương ứng trong cặp nghòch thế – Lặp lại xử lý trên với các phần tử tiếp... bò ghi đè khi dời chỗ các phần tử for(int i=1 ; i0)&&(a[pos-1]>x);pos ) a[pos] = a[pos-1]; a[pos] = x;// chèn x vào dãy } } 50 Insertion Sort – Nhận xét • Khi tìm vò trí thích hợp để chèn a[i] vào đoạn a[0] đến a[i-1], do đoạn đã được sắp có thể sử dụng giải thuật tìm nhò phân để thực hiện việc tìm vò trí pos giải thuật sắp xếp chèn nhò phân Binary... bằng cách chọn ra được một cấu trúc dữ liệu cho phép tích lũy cácthông tin về sự so sánh giá trò các phần tử trong quá trình sắpxếp 80 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: 81 Sắpxếp cây - Heap sort • Phần tử ở mức i chính là phần tử lớn trong cặp phần tử tương ứng ở mức i+1 ⇒ phần tử ở mức 0 (nút gốc . không chứa nghòch thế. a 0 ≤ ≤≤ ≤ a 1 ≤ ≤≤ ≤ … ≤ ≤≤ ≤ a n 26 26 Các phương pháp sắp xếp thông dụng • Selection sort • Insertion sort • Interchange sort • Bubble. hợp như sau: Phương pháp đổi chỗ trực tiếp Interchange Sort 55 55 Interchange Sort – Ý tưởng • Nhận xét: Để sắp xếp một dãy số, ta có thể xét các nghòch