1. Trang chủ
  2. » Thể loại khác

BÀI 7: SẮP XẾP. MÔN: CÔNG NGHỆ THÔNG TIN

24 2 0

Đ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

Nội dung

Bài 7: Sắp xếp BÀI 7: SẮP XẾP Mục tiêu Nội dung Sau học này, bạn có thể:  Mô tả khái niệm, chất mục đích việc xếp  Trình bày thực cài đặt cách xác thuật toán xếp bao gồm thuật toán xếp bản, thuật toán xếp theo phương pháp chia để trị, Heap Sort  Đánh giá thuật tốn xếp tìm thuật toán xếp phù hợp cho toán     Giới thiệu toán xếp Một số phương pháp xếp Các phương pháp xếp theo kiểu chia để trị: Quick Sort Merge Sort Khối (Heap) Heap Sort Thời lượng học 10 tiết CS101_Bai7_v2.0014101214 127 Bài 7: Sắp xếp 7.1 Giới thiệu toán xếp Trong thực tế sống, gặp nhiều toán thống kê, cần xếp thứ hạng nhiều tổng thể quan sát thu thập số liệu số tin tức liên quan Chẳng hạn, vận hội Bắc Kinh năm 2008, có 200 đồn tham gia thi đấu 35 mơn thể thao để tranh loại huy chương: vàng, bạc đồng Trong 18 ngày thi đấu, ban tổ chức cơng bố thứ hạng đồn Thực chất, tốn xếp thống kê Trong nhiều ứng dụng tin học, yêu cầu xếp thường xuất với mục đích khác nhau: xếp liệu máy tính để thuận lợi cho việc tìm kiếm xử lý để in bảng, biểu v.v… Sắp xếp trình xử lý danh sách phần tử (hoặc mẫu tin) để đặt chúng theo thứ tự, thỏa mãn tiêu chuẩn dựa nội dung thơng tin lưu giữ phần tử Cho trước dãy số a1, a2,…, aN lưu trữ cấu trúc liệu mảng Sắp xếp dãy số a1, a2,…, aN thực việc bố trí lại phần tử cho dãy ak1, ak2,…, akN hình thành có thứ tự (giả sử xét thứ tự tăng) nghĩa aki > aki – Hai thao tác so sánh gán thao tác hầu hết thuật toán xếp Bài toán xếp xuất lĩnh vực tin học, từ ứng dụng ẩn bên hệ điều hành tốn điều khiển q trình, toán lập lịch cho CPU, toán quản lý nhớ… ứng dụng thông thường xếp dãy từ, câu, ghi theo thứ tự Khi xây dựng thuật tốn xếp, cần tìm cách giảm thiểu phép so sánh đổi chỗ không cần thiết để tăng hiệu thuật toán Ðối với dãy số lưu trữ nhớ chính, nhu cầu tiết kiệm nhớ đặt nặng, thuật tốn xếp địi hỏi cấp phát thêm vùng nhớ để lưu trữ dãy kết vùng nhớ lưu trữ dãy số ban đầu thường quan tâm Thay vào đó, thuật tốn xếp trực tiếp dãy số ban đầu – gọi thuật toán xếp chỗ – lại đầu tư phát triển Phần này, giới thiệu số giải thuật xếp từ đơn giản đến phức tạp áp dụng thích hợp cho việc xếp Sau số phương pháp xếp thông dụng đề cập đến này:  Sắp xếp kiểu chọn – Selection Sort  Sắp xếp kiểu chèn – Insertion Sort  Sắp xếp kiểu bọt – Bubble Sort  Sắp xếp nhanh – Quick Sort  Sắp xếp kiểu trộn – Merge Sort  Sắp xếp kiểu khối – Heap Sort Chúng ta khảo sát thuật toán Các thuật toán Insertion Sort, Selection Sort, Bubble Sort thuật toán đơn giản dễ cài đặt chi phí cao Các thuật toán Heap Sort, Quick Sort, Merge Sort phức tạp hiệu suất cao nhóm thuật tốn đầu Cả hai nhóm thuật tốn có điểm chung xây dựng dựa sở so sánh giá trị phần tử mảng (hay so sánh khóa tìm kiếm) 128 CS101_Bai7_v2.0014101214 Bài 7: Sắp xếp 7.2 Một số phương pháp xếp 7.2.1 Sắp xếp kiểu chèn – Insertion Sort 7.2.1.1 Tư tưởng thuật tốn Giả sử có dãy a1, a2,…, an, i phần tử phần đầu dãy a1, a2,…, – 1, có thứ tự Ý tưởng thuật toán chèn phần tử thứ i + vào i phần tử dãy có thứ tự để dãy a1, a2,…, + trở nên có thứ tự Việc chèn thực sau: tiến hành tìm vị trí phần tử i + k phần tử cách vận dụng thuật giải tìm kiếm (tuần tự nhị phân), sau tìm vị trí chèn tiến hành chèn phần tử i + cách dời phần tử từ vị trí chèn đến phần tử thứ i sang phải vị trí chèn phần tử i + vào vị trí 7.2.1.2 Nội dung cách cài đặt thuật toán Thuật toán xếp dãy a1, a2,…, an theo thứ tự tăng dần phương pháp xếp kiểu chèn Bước 1: i = 1; Bước 2:đặt x = a[i]; j = i – 1; Bước 3: while (j >= 0) && (x < a[j]) a[j + 1] = a[j]; j––; Bước 4: đặt a[j + 1] = x ; i++; Bước 5: i < = n – lặp lại bước ngược lại kết thúc Cài đặt thuật tốn: #define Max_Size … typedef Kieu_du_lieu KeyType; //kiểu liệu khóa xếp typedef struct KeyArray { KeyType Array[Max_Size]; //mảng phần tử có kiểu KeyType int n; //số lượng phần tử mảng }; KeyArray Sortinsert( KeyArray a) { int i,j; KeyType x; i = 1; while ( i = )&&(x < a.Array[j])) { a.Array[j + 1] = a.Array[j]; j––; } a.Array[j + 1] = x ; //đưa giá trị cần chèn vào vị trí trống i++; } return a; } Trong cách cài đặt thuật toán xếp chèn trên, ta sử dụng phương pháp tìm kiếm để xác định vị trí cần chèn Do đoạn a[1] đến a[i – 1] xếp, nên ta hồn tồn sử dụng giải thuật tìm nhị phân để thực việc tìm vị trí để chèn a[i] vào Việc xây dựng giải thuật xếp kiểu chèn với phương pháp tìm kiếm nhị phân để xác định vị trí chèn xem tập cho học viên tự giải Ví dụ 7.1 Cho dãy số a: 12, 2, 8, 5, 1, 6, 4, 15 Sắp xếp dãy số a theo thứ tự tăng dần phương pháp xếp chèn Ta thực sau: 130 CS101_Bai7_v2.0014101214 Bài 7: Sắp xếp 7.2.1.3 Đánh giá thuật toán Ðối với giải thuật xếp kiểu chèn, phép so sánh xảy vịng lặp while tìm vị trí chèn thích hợp j Mỗi lần xác định vị trí xét khơng thích hợp, dời chỗ phần tử a[j] tương ứng Giải thuật thực tất N – vòng lặp while Do số lượng phép so sánh phép dời chỗ phụ thuộc vào tình trạng dãy số ban đầu, nên ta ước lược trường hợp sau:  Trường hợp tốt nhất, dãy phần tử cần xếp có thứ tự tăng: o Số phép gán: Sgán = 2(n – 1) o Số phép so sánh: Sso sánh = n –  Trường hợp xấu nhất, dãy phần tử cần xếp có thứ tự giảm dần: n(n  1) 1 o Số phép gán: Sgán = o Số phép so sánh: Sso sánh = n(n  1) Như vậy, độ phức tạp thuật toán xếp chèn O(n2) cho trường hợp xấu trường hợp trung bình 7.2.2 Sắp xếp kiểu chọn – Selection sort 7.2.2.1 Tư tưởng thuật toán Ban đầu, dãy gồm n phần tử khơng có thứ tự Ta chọn phần tử nhỏ n phần tử dãy cần xếp đổi giá trị với a[1], a[1] có giá trị nhỏ dãy Lần thứ 2, chọn phần tử nhỏ n – phần tử lại a[2], a[3], , a[n] đổi giá trị với a[2] Ở lượt thứ i ta chọn dãy a[i n] phần tử nhỏ đổi chỗ giá trị với a[i] Tới lượt thứ n – Chọn phần tử a[n – 1] a[n] phần tử có giá trị nhỏ đổi giá trị với a[n – 1] Khi đó, dãy thu có thứ tự không giảm 7.2.2.2 Nội dung cách cài đặt thuật toán Thuật toán xếp n phần tử mảng a[1], a[2], , a[n] theo thứ tự tăng dần CS101_Bai7_v2.0014101214 131 Bài 7: Sắp xếp Bước 1: i = 0; Bước 2: tìm phần tử a[min] nhỏ dãy từ a[i] tới a[n – 1] Bước 3: hoán vị a[min] a[i] Bước : i a.Array[j]) = j; tg = a.Array[i]; a.Array[i] = a.Array[min]; a.Array[min] = tg; } return a; } Ví dụ 7.2 Cho dãy số a: 12, 2, 8, 5, 1, 6, 4, 15 Sắp xếp dãy số theo thứ tự tăng dần thuật toán xếp lựa chọn minh họa sau: 132 CS101_Bai7_v2.0014101214 Bài 7: Sắp xếp 7.2.2.3 Đánh giá thuật toán Ta nhận thấy lượt thứ I, để chọn phần tử nhỏ cần n – i phép so sánh Số lượng phép so sánh thuật tốn khơng phụ thuộc vào tình trạng ban đầu mảng, đó, tổng số phép tốn so sánh là: Sso sánh = (n – 1) + (n – 2) + + + = n(n – 1) /  Trong trường hợp tốt nhất, dãy có thứ tự tăng dần: Số phép gán Sgán =  Trong trường hợp tồi dãy có thứ tự giảm dần: Số phép gán Sgán = * (n – 1) + n * (n – 1) / = (n – 1)(n + 6) / Như vậy, độ phức tạp thuật toán xếp lựa chọn O(n2) 7.2.3 Sắp xếp kiểu đổi chỗ Các thuật tốn kiểu xếp tìm cách đổi chỗ phần tử đứng sai vị trí (so với dãy xếp) dãy a cho để cuối tất phần tử dãy a vị trí dãy xếp Trong phần này, tìm hiểu thuật toán đơn giản, dễ hiểu dễ cài đặt cho kiểu xếp đổi chỗ thuật toán xếp bọt (bubble Sort) 7.2.3.1 Tư tưởng thuật toán xếp bọt Đi từ cuối mảng đầu mảng, trình đi, phần tử (đứng phía sau) nhỏ phần tử đứng (trước) theo ngun tắc bọt khí, phần tử nhẹ bị “trồi” lên phần tử nặng (hai phần tử đổi chỗ cho nhau) Kết phần tử nhỏ (nhẹ nhất) đưa đầu dãy nhanh Sau khơng xét đến bước tiếp theo, lần xử lý thứ i có vị trí đầu dãy i Lặp lại xử lý khơng cịn cặp phần tử để xét ta có dãy xếp theo thứ tự 7.2.3.2 Nội dung cách cài đặt thuật toán Thuật toán xếp kiểu bọt danh sách gồm mục a[1], a[2], , a[n] theo thứ tự tăng dần Thuật toán thể sau: CS101_Bai7_v2.0014101214 133 Bài 7: Sắp xếp KeyType tg; Bước 1: i = 0; for (i = Bước 2: duyệt từ for (j = if (a[j 0;i < n – 2;i++)//lần lượt xử lý với i cuối ngược vị trí i n – 1; j >= i + 1; j––) – 1] >a [j])//hoán vị trí a[j] a[j – 1] { tg = a[j – 1]; a[j – 1] = a[j]; a[j] = tg; } Cài đặt thuật toán: KeyArray Sortbubble(KeyArray a) { int i,j; KeyType tg; i = 0; for (i = 0; i < a.n – 2; i++) for (j = a.n – 1; j >= i + 1; j––) if (a.Array[j –1 ] > a.Array[j]) { tg = a.Array[j – 1]; a.Array[j – 1] = a.Array[j]; a.Array[j] = tg; } return a; } Ví dụ 7.3 Cho dãy số a: 12, 2, 8, 5, 1, 6, 4, 15 Sắp xếp dãy số a theo thứ tự tăng dần thuật toán xếp bọt minh họa đây: 134 CS101_Bai7_v2.0014101214 Bài 7: Sắp xếp CS101_Bai7_v2.0014101214 135 Bài 7: Sắp xếp 7.2.3.3 Đánh giá thuật toán Ta nhận thấy giải thuật bọt, số lượng phép so sánh không phụ thuôc vào trạng thái ban đầu dãy cần xếp, số hoán vị lại phụ thuộc vào trạng thái ban đầu dãy Trong trường hợp tốt nhất, tức dãy ban đầu có thứ tự tăng dần tổng số hốn vị Shv = Trong trường hợp xấu nhất, danh sách có thứ tự giảm dần: ta thấy, qua dãy lần đầu có n – lần so sánh n – lần hoán vị Trong lần thứ 2, dãy gồm n – phần tử duyệt có n – lần so sánh hồn vị Q trình tiếp tục danh sách gồm phần tử lần có lần so sánh hốn vị Như vậy, trường hợp xấu nhất: Số lần so sánh Sso sánh = (n – 1) + (n – 2) + + + = n(n – 2) / Số lần hoán vị Shoán vị = (n – 1) + (n – 2) + + + = n(n – 2) / Vì lệnh so sánh hốn vị lệnh thường xuất thuật toán nên chúng xác định độ phức tạp thuật toán Do vậy, độ phức tạp thuật toán trường hợp xấu O(n2) 7.3 Các phương pháp xếp theo kiểu chia để trị: Quick Sort Merge Sort 7.3.1 Tư tưởng phương pháp xếp theo kiểu chia để trị Từ giải thuật trình bày từ kinh nghiệm thực tế, ta nhận thấy việc xếp danh sách dài khó xếp danh sách ngắn Nếu chiều dài danh sách tăng gấp đơi cơng việc xếp thông thường tăng gấp đôi (với xếp kiểu chèn xếp kiểu chọn, khối lượng cơng việc tăng lên khoảng bốn lần) Do đó, chia danh sách thành hai phần có kích thước xấp xỉ thực việc xếp phần cách riêng rẽ khối lượng công việc cần cho việc xếp giảm đáng kể Ví dụ, việc xếp phiếu thư viện nhanh phiếu chia thành nhóm có chung chữ đầu nhóm tiến hành xếp riêng rẽ Ở đây, vận dụng ý tưởng chia toán thành nhiều toán tương tự toán ban đầu nhỏ giải tốn nhỏ Sau đó, tổng hợp lại để có lời giải cho tồn tốn ban đầu Phương pháp gọi “chia để trị” (Divide – and – Conquer) Để xếp danh sách con, lại áp dụng chiến lược chia để trị để tiếp tục chia nhỏ danh sách Q trình dĩ nhiên khơng bị lặp vơ tận Khi ta có danh sách với kích thước phần tử q trình dừng Vấn đề lại cần xem xét cách phân hoạch (Partition) danh sách ban đầu cách kết nối (Combine) hai danh sách có thứ tự cho thành danh sách có thứ tự Do đó, nghiên cứu hai phương pháp xếp Quick Sort Merge Sort, phương pháp làm việc tốt ứng với số trường hợp riêng 7.3.2 Quick Sort 7.3.2.1 Tư tưởng thuật toán Trong thuật tốn xếp tìm hiểu trước đây, ý tưởng chọn phần tử nhỏ hay lớn danh sách danh sách đặt vào vị trí danh sách Trong sơ đồ thuật tốn này, chọn mục 136 CS101_Bai7_v2.0014101214 Bài 7: Sắp xếp định vị cho mục Tuy nhiên, mục chọn không thiết phần tử nhỏ hay lớn mà phần tử ngẫu nhiên danh sách cần xếp làm khóa chốt Tính từ khóa chốt, phần tử nhỏ khóa chốt phải xếp trước chốt; phần tử lớn khóa chốt xếp vào sau chốt Để làm điều đó, phần tử danh sách so sánh với khóa chốt tráo vị trí cho cho khóa chốt phần tử lớn chốt mà lại nằm trước chốt nhỏ chốt lại nằm sau chốt Khi việc đổi chỗ lần thực xong danh sách tạo thành hai đoạn: đoạn gồm phần tử nhỏ chốt, đoạn gồm phần tử lớn chốt cịn khóa chốt vị trí phần tử danh sách xếp Áp dụng kỹ thuật cho đoạn trước chốt sau chốt đoạn lại hai phần tử dừng lại Khi đó, danh sách xếp Cụ thể giả sử để xếp dãy số a gồm n phần tử: a1, a2,…, an; giải thuật Quick Sort dựa việc phân hoạch dãy ban đầu chia thành hai phần: Dãy gồm phần tử: a1,…, – có giá trị nhỏ ai; Dãy gồm phần tử: + 1,…, an có giá trị lớn ai; Với phần tử dãy Để xếp dãy 2, 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 7.3.2.2 Nội dung cách cài đặt thuật toán KeyType Item ,X; Bước : first = 0; Bước : last = n – 1; Bước 3:Xuất phát từ đầu dãy để tìm phần tử có giá trị > X i = first; Bước 4: Xuất phát từ cuối dãy để tìm phần tử có giá trị < X j = last; Bước 5: Khóa chốt phần tử X = a[(i + j)/ 2]; Bước 6:Lặp tìm phần tử có giá trị lớn X nhỏ X { while (a[i] < X) i = i + 1; while (a[j] > X) j = j – 1; if (i X) j = j – 1; if (i

Ngày đăng: 11/07/2022, 02:36

HÌNH ẢNH LIÊN QUAN

Hình dưới đây mô tả việc vun một cây nhị phân hoàn chỉnh thành một khối với điều kiện hai nhánh con của nó là khối - BÀI 7: SẮP XẾP. MÔN: CÔNG NGHỆ THÔNG TIN
Hình d ưới đây mô tả việc vun một cây nhị phân hoàn chỉnh thành một khối với điều kiện hai nhánh con của nó là khối (Trang 19)