Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 23 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
23
Dung lượng
1,23 MB
Nội dung
04/2010 Bài tốn xếp • Cho tập N phần tử, phần tử có số thuộc tính • Dựa vào (hoặc vài) thuộc tính phần tử để xếp lại chúng theo trật tự KỸ THUẬT LẬP TRÌNH C Chương 7: Các thuật tốn xếp bangtqh@hotmail.com bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 04/2010 Bài tốn xếp Các giải thuật xếp • Gồm tốn con: • • • • • • • • • – Dựa theo khố xếp định vị lại thứ tự phần tử – Chuyển phần tử cần vị trí • Hai thao tác – So sánh – Gán bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp Sắp xếp đổi chỗ trực tiếp - Interchange Sort Sắp xếp chọn trực tiếp – Selection Sort Sắp xếp chèn trực tiếp – Insertion Sort Sắp xếp bọt – Buble Sort Sắp xếp bọt cải tiến - Shaker Sort Shell sort Heap sort Quick sort Merge sort bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 04/2010 Đổi chỗ trực tiếp – Interchange Sort Đổi chỗ trực tiếp – Interchange Sort • Khái niệm nghịch thế: • Tìm tất nghịch thế, triệt tiêu chúng cách hốn vị phần tử tương ứng nghịch – Xét mảng số a0, a1, an – Nếu có i aj, ta gọi nghịch • Mảng chưa xếp có nghịch • Mảng có thứ tự khơng chứa nghịch bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 Đổi chỗ trực tiếp – Interchange Sort Đổi chỗ trực tiếp – Interchange Sort • Cho dãy số a: 12 • Bước : i = 1; // đầu dãy • Bước : j = i+1; //tìm phần tử a[j] < a[i], j>i • Bước : Trong j < N thực Nếu a[j]i ; j ) if(a[j]< a[j-1]) Swap(a[j], a[j-1]); } bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 39 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 40 04/2010 Bubble Sort - Kết Các giải thuật xếp 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 15 12 Kỹ thuật lập5trình C - Thuật tốn xếp 8 15 12 15 41 bangtqh@hotmail.com 04/2010 • • • • • • • • • Sắp xếp đổi chỗ trực tiếp - Interchange Sort Sắp xếp chọn trực tiếp – Selection Sort Sắp xếp chèn trực tiếp – Insertion Sort Sắp xếp bọt – Buble Sort Sắp xếp bọt cải tiến - Shaker Sort Shell sort Heap sort Quick sort Merge sort bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 Shaker Sort • Dựa ngun tắc đổi chỗ trực tiếp 42 04/2010 Shaker Sort void ShakeSort(int data[], int n){ int i, j, left, right, k; left = 0; right = d.n-1; k = n-1; Khắc phục nhược điểm Bubble Sort while (left < right) { for (j = right; j > left; j ) if (data[j]< data[j-1]){ Doicho(data[j], data[j-1]); k =j; } left = k; for (j = left; j < right; j++) if (data[j]> data[j+1]) { Doicho(data[j],data[j-1]); k = j; } right = k; } • Trong lần xếp, duyệt mảng theo lượt từ phiá khác : – Lượt đi: đẩy phần tử nhỏ đầu mảng – Lượt về: đẩy phần tử lớn cuối mảng • Ghi nhận lại đoạn xếp nhằm tiết kiệm phép so sánh thừa } bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 43 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 44 04/2010 Các giải thuật xếp • • • • • • • • • • Đònh nghóa heap: Sắp xếp đổi chỗ trực tiếp - Interchange Sort Sắp xếp chọn trực tiếp – Selection Sort Sắp xếp chèn trực tiếp – Insertion Sort Sắp xếp bọt – Buble Sort Sắp xếp bọt cải tiến - Shaker Sort Shell sort Heap sort Quick sort Merge sort – Heap dãy phần tử aleft, aleft+1, , aright thoả quan hệ: • ≥ a2i • ≥ a2i+1 với ∀i ∈ [left, right] – Khi (ai , a2i), (ai ,a2i+1) gọi cặp phần tử liên đới – Heap đònh nghóa dùng trường hợp xếp tăng dần, xếp giảm dần phải đổi chiều quan hệ Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com Sắp xếp vun đống - Heap sort 04/2010 45 04/2010 Ví dụ dãy heap: 15 12 Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com 46 Sắp xếp vun đống – Heap sort a1 a2 a4 Các phần tử dãy biểu diễn theo mối quan hệ liên đới a3 a5 a6 04/2010 a7 a8 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 47 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 48 Sắp xếp vun đống - Heap sort 04/2010 04/2010 Sắp xếp vun đống - Heap sort • Một số tính chất Heap: • Sắp xếp dãy tăng dần qua giai đoạn: – Tính chất 1: Nếu aleft, aleft+1, …, aright heap cắt bỏ số phần tử hai đầu heap, dãy lại heap – Tính chất 2: Nếu a1, a2, …, an heap phần tử a1 (đầu heap) phần tử lớn heap – Tính chất 3: Mọi dãy aleft, aleft+1, , aright thỏa: 2left > right heap bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp Heap sort – Giai đoạn – Giai đoạn 1: hiệu chỉnh dãy ban đầu thành heap – Giai đoạn 2: xếp heap có sau giai đoạn thành dãy tăng dần 49 04/2010 Tạo heap 12 12 15 15 12 12 15 15 15 12 n = 8, n/2 = Xuất phát từ a[4], so sánh với a[8] đổi chổ a[3] so sánh với a[6], a[7] a[2] so sánh với a[4], a[5] a[2]↔ ↔a[4] lan truyền so sánh a[4] với a[8] • … • • • • //Lưu ý: đoạn aleft+1, …, aN heap • Bước 21: Hiệu chỉnh đoạn aleft, …, aN thành heap • Bước 22: left = left - 1; //Hết lặp Kỹ thuật lập trình C - Thuật tốn xếp 50 04/2010 //input: dãy (a, N) //output: dãy (a, N) heap • Bước 1: left = N/2; //Thêm phần tử aleft, , a1 vào heap • Bước 2: Trong left > bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com 51 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 52 04/2010 04/2010 Heap sort – Giai đoạn Heap sort – Giai đoạn • Vấn đề: Sắp xếp heap a1, …, aN thành dãy tăng dần //Đặt: right = N Ł dãy a1, …, aright heap • Ý tưởng: //input: dãy (a, N) heap //output: dãy (a, N) tăng dần • Bước 1: right = N; //Bắt đầu thực từ cuối dãy • Bước 2: Trong right > – Theo tính chất 2: a1 phần tử lớn nhất, vò trí a1 phải right - cuối dãy //Đưa phần tử lớn (a1)về vò trí right • Bước 2.1: Hoánvò (a1 , aright); //Loại bỏ phần tử lớn khỏi heap • Bước 2.2: right := right -1; • Bước 2.3: Hiệu chỉnh đoạn a1, a2, …, aright thành heap Ł Đổi chổ (a1, aright) Ł thêm phần tử vò trí q Theo tính chất 3: dãy a2, …, aright-1 heap Ł Giảm right, thêm a1 vào dãy hiệu chỉnh lại Ł dãy a1, …, aright heap //Hết lặp Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com 53 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 Hiệu chỉnh heap 04/2010 Các giải thuật xếp 15 12 2 12 15 12 15 12 15 12 15 • Đỗi chổ a[1] ↔ a[8] có phần tử vị trí • Tiến hành tương tự cho dãy n-1 phần tử Lưu ý: Chỉ cần xét phần tử a[1] bangtqh@hotmail.com 54 Kỹ thuật lập trình C - Thuật tốn xếp 55 • • • • • • • • • Sắp xếp đổi chỗ trực tiếp - Interchange Sort Sắp xếp chọn trực tiếp – Selection Sort Sắp xếp chèn trực tiếp – Insertion Sort Sắp xếp bọt – Buble Sort Sắp xếp bọt cải tiến - Shaker Sort Shell sort Heap sort Quick sort Merge sort bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 56 04/2010 Quick sort – Ý tưởng Quick sort – Ý tưởng • Giải thuật QuickSort xếp dãy a1, a2 , aN dựa việc phân hoạch dãy ban đầu thành phần : – Phần 1: Gồm phần tử có giá trò không lớn x – Phần 2: Gồm phần tử có giá trò x – Phần 3: Gồm phần tử có giá trò không bé x với x giá trò phần tử tùy ý dãy ban đầu bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 57 • Sau thực phân hoạch, dãy ban đầu phân thành đoạn: – ak < x , với k = j – ak = x , với k = j+1 i-1 – ak > x , với k = i N bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 Quick sort – Ý tưởng Kỹ thuật lập trình C - Thuật tốn xếp 04/2010 Quick sort – Ý tưởng • Đoạn thứ có thứ tự • Nếu đoạn có nhiều phần tử dãy ban đầu có thứ tự đoạn 1, • Để xếp đoạn 3, ta tiến hành việc phân hoạch dãy theo phương pháp phân hoạch dãy ban đầu vừa trình bày … • Đoạn thứ có thứ tự • Nếu đoạn có phần tử: có thứ tự dãy ban đầu bangtqh@hotmail.com 58 59 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 60 04/2010 04/2010 Quick sort – Giải thuật Quick sort – Phân hoạch dãy • Bước 1: Nếu left ≥ right //dãy có phần tử //input: dãy aleft, …, aright //output: dãy chia thành đoạn: đoạn ≤ đoạn ≤ đoạn • Bước 1: Chọn tùy ý phần tử a[p] dãy giá trò mốc: Kết thúc; //dãy xếp x = a[p]; • Bước 2: Phân hoạch dãy aleft … aright thành đoạn: aleft aj, aj+1 ai-1, Aright • Bước 2: Duyệt từ đầu dãy để phát hiệu chỉnh cặp phần tử a[i], a[j] vi phạm điều kiện – – – – Đoạn ≤ x Đoạn 2: aj+1 ai-1 = x Đoạn 3: aright ≥ x • Hoán vò (a[i],a[j]); • Bước 3: Sắp xếp đoạn 1: aleft aj • Bước 4: Sắp xếp đoạn 3: aright bangtqh@hotmail.com Bước 21: i = left; j = right; Bước 22: Trong (a[i]x) j ; Bước 24: Nếu i x) j ; if(i [...]... 5 6 7 8 2 12 5 8 1 6 4 15 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 76 04/2010 Merge sort – Ví dụ Merge sort – Ví dụ Trộn từng c p đường chạy k = 2; 1 2 3 4 2 12 1 5 8 4 5 6 7 8 Trộn từng c p đường chạy k = 2; 1 2 3 4 6 2 12 1 6 15 5 8 4 15 Kỹ thuật lập trình C - Thuật tốn sắp xếp bangtqh@hotmail.com 04/2010 77 5 6 7 Kỹ thuật lập trình C - Thuật tốn sắp xếp bangtqh@hotmail.com 78 ... …, a3k, … / /c = ak+1, …, a2k, a3k+1, …, a4k, … Phân phối đều luân phiên – Bư c 22: Trộn từng c p dãy con gồm k phần tử c a 2 dãy b, c vào a – Bư c 23: k = k*2; bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 71 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 72 04/2010 Merge sort – Ví dụ Merge sort – Ví dụ 1 2 3 4 5 6 7 8 12 2 8 5 1 6 4 15 Kỹ thuật lập trình C - Thuật tốn sắp... Bư c 25: Nếu i < j: //Hết duyệt Kỹ thuật lập trình C - Thuật tốn sắp xếp 61 bangtqh@hotmail.com i++; j ; Lặp lại Bư c 22.//chưa xét hết mảng Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 Quick sort – Ví dụ • Cho dãy số a: 12 2 8 5 62 04/2010 Quick sort – Ví dụ 1 6 4 15 Phân hoạch đoạn l =1, r = 8: x = A[4] = 5 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 63 bangtqh@hotmail.com Kỹ thuật. .. bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 57 • Sau khi th c hiện phân hoạch, dãy ban đầu đư c phân thành 3 đoạ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 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 Quick sort – Ý tưởng Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 Quick sort – Ý tưởng • Đoạn thứ 2 đã c thứ tự • Nếu c c. .. thuật lập trình C - Thuật tốn sắp xếp 64 04/2010 Quick sort – Ví dụ 04/2010 Quick sort – Ví dụ • Phân hoạch đoạn l =1, r = 3: • Phân hoạch đoạn l = 5, r = 8: x = A[2] = 2 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 65 bangtqh@hotmail.com x = A[6] = 6 Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 66 04/2010 Quick sort – C i đặt • Phân hoạch đoạn l = 7, r = 8: bangtqh@hotmail.com Kỹ thuật. .. N, nb, nc, k); Merge(a, nb, nc, k); } } bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 85 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 Merge sort – C i đặt Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 Merge sort – C i đặ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);... và 3 c nhiều hơn 1 phần tử thì dãy ban đầu chỉ c thứ tự khi c c đoạn 1, 3 đư c sắp • Để sắp xếp c c đoạn 1 và 3, ta lần lượt tiến hành vi c phân hoạch từng dãy con theo c ng phương pháp phân hoạch dãy ban đầu vừa trình bày … • Đoạn thứ 2 đã c thứ tự • Nếu c c đoạn 1 và 3 chỉ c 1 phần tử: đã c thứ tự khi đó dãy con ban đầu đã đư c sắp bangtqh@hotmail.com 58 59 bangtqh@hotmail.com Kỹ thuật lập trình. .. tử lớn về cuối mảng • Ghi nhận lại những đoạn đã sắp xếp nhằm tiết kiệm c c phép so sánh thừa } bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 43 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 44 04/2010 C c giải thuật sắp xếp • • • • • • • • • • Đònh nghóa heap: Sắp xếp đổi chỗ tr c tiếp - Interchange Sort Sắp xếp chọn tr c tiếp – Selection Sort Sắp xếp chèn tr c tiếp –... trình C - Thuật tốn sắp xếp bangtqh@hotmail.com Sắp xếp vun đống - Heap sort 04/2010 45 04/2010 Ví dụ dãy là heap: 1 2 3 4 5 6 7 8 15 12 8 5 1 4 6 2 Kỹ thuật lập trình C - Thuật tốn sắp xếp bangtqh@hotmail.com 46 Sắp xếp vun đống – 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 04/2010 a7 a8 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 47 bangtqh@hotmail.com... Quick sort Merge sort bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn sắp xếp 04/2010 – Mỗi dãy a1, a2, , an bất kỳ là một tập hợp c c dãy con liên tiếp mà mỗi dãy con đều đã c thứ tự • Ví dụ: dãy 12, 2, 8, 5, 1, 6, 4, 15 c thể coi như gồm 5 dãy con không giảm (12); (2, 8); (5); (1, 6); (4, 15) – Dãy đã c thứ tự coi như c 1 dãy con Ł Hướng tiếp c n: tìm c ch làm giảm số dãy con không giảm c a ... Nếu c i aj, ta gọi nghịch • Mảng chưa xếp c nghịch • Mảng c thứ tự khơng chứa nghịch bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật. .. bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 71 bangtqh@hotmail.com Kỹ thuật lập trình C - Thuật tốn xếp 72 04/2010 Merge sort – Ví dụ Merge sort – Ví dụ 12 15 Kỹ thuật lập trình C - Thuật. .. Trộn c p đường chạy k = 2; 12 8 Trộn c p đường chạy k = 2; 12 15 15 Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com 04/2010 77 Kỹ thuật lập trình C - Thuật tốn xếp bangtqh@hotmail.com 78