Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 12: Các thuật toán sắp xếp nhanh O(nlogn)
lượt xem 3
download
Bài giảng "Cấu trúc dữ liệu và giải thuật trong C++ - Bài 12: Các thuật toán sắp xếp nhanh O(nlogn)" cung cấp cho người học các kiến thức: Sắp xếp nhanh – Quick sort; sắp xếp trộn - Merge sort; vun đống – Heap sort. Mời các bạn cùng tham khảo.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 12: Các thuật toán sắp xếp nhanh O(nlogn)
- Bài 12. Các thuật toán sắp xếp nhanh O(nlogn) Sắp xếp nhanh – Quick sort Sắp xếp trộn - Merge sort Vun đống – Heap sort Sorting 1
- Chia và trị - Divide and conquer Chia và trị là phương pháp thiết kế thuật toán theo kiểu: Phân chia: Chia dữ liệu đầu vào S của bài toán thành 2 tập con rời nhau S1 và S2 Đệ qui: Giải bài toán với dữ liệu vào là các tập con S1 và S2 Trị: kết hợp các kết quả của S1 và S2 thành kết quả của S Trường hợp cơ sở cho thuật toán đệ qui ở đây là các bài toán có kích thước 0 hoặc 1 Sorting 2
- Sắp xếp nhanh – Quick sort Ý tưởng (sử dụng phương pháp chia và trị): Thực hiện phân hoạch dãy S cần sắp thành 3 dãy S1, S2, S3. Trong đó: • S2 chỉ có một phần tử, tất cả các phần tử của dãy S3 đều > phần tử của dãy S2. • Tất cả các phần tử của dãy S1 đều ≤ phần tử của dãy S2 • Dãy S1, S3 có thể là rỗng Tiếp tục phân hoạch dãy S1 và S3 độc lập theo nguyên tắc trên đến khi dãy cần thực hiện phân hoạch chỉ có một phần tử thì dừng lại. Khi đó ta được dãy các phần tử được sắp. Sorting 3
- Thuật toán sắp xếp Quick sort Từ ý tưởng của thuật toán, ta có thể dễ dàng xây dựng thuật toán sắp xếp dưới dạng đệ qui như sau: Algorithm QuickSort (array A, i, j ); Input: Dãy các phần tử A[i],..,A[j] và hai số nguyên i, j Output: Dãy A[i],..,A[j] được sắp. if i < j then Partition (A,i, j, k); //k lấy chỉ số của phần tử làm S2 Quicksort (A,i, k-1); Quicksort (A,k+1, j); Sorting 4
- Ví dụ Sorting 5
- Vấn đề đặt ra ở đây là phân hoạch dãy S như thế nào? Sorting 6
- Thuật toán phân hoạch • Chọn một phần tử bất kỳ của dãy làm dãy S2 (phần 6 12 32 1 3 tử này được gọi là phần tử chốt - pivot). 6 3 32 1 12 • Thực hiện chuyển các phần tử có khóa ≤ phần 6 3 1 32 12 tử chốt về bên trái và các phần tử > phần tử chốt về bên phải, sau đó đặt phần tử chốt về đúng vị 1 3 6 32 12 trí của nó trong dãy. Sau khi phân hoạch Sorting 7
- Chú ý • Phần tử chốt có thể được chọn là một phần tử bất kỳ của dãy. - Phần tử chốt có thể chọn là phần tử đầu hoặc giữa hoặc cuối dãy. - Tốt nhất là chọn phần tử chốt mà nó làm cho việc phân hoạch thành hai dãy S1 và S3 có số phần tử xấp xỉ bằng nhau. Sorting 8
- Thuật toán • Phân hoạch dãy gồm các phần tử A[i],..,A[j] • Chọn phần tử đầu dãy làm chốt • Sử dụng 2 biến left và right: - left chạy từ trái sang phải bắt đầu từ i. - right chạy từ phải sang trái bắt đầu từ j - Biến left được tăng cho tới khi A[left].Key> A[i].Key hoặc left >right - Biến right được giảm cho tới khi A[right].Key right - Cuối cùng tráo đổi A[i] và A[right] Sorting 9
- Ví dụ phân hoạch 10 3 24 1 4 21 54 5 i j ? Sorting 10
- Thuật toán phân hoạch Algorithm Partition (Array A, i, j, &right ) Input: Dãy các phần tử A[i],..,A[j], 2 số nguyên i, j Output: Dãy A[i],..,A[j] được phân hoạch, right là chỉ số của phần tử làm S2. p A[i]; left i; right j; while ( left < right ) while( A[left].Key p.Key ) right right-1; if left < right then SWAP(A[left],A[right]); if i right then A[i] A[right]; A[right] p; Sorting 11
- Ví dụ Sắp xếp dãy số A= … 10 3 24 1 4 21 54 5 … i=1 j=8 ? Sorting 12
- Mô tả quá trình Sắp xếp Quicksort(A,1, 8) 10 3 24 1 4 21 54 5 i=1 j=8 i
- Quicksort(A,1, 2) 1 3 4 5 10 21 54 24 i=1 j=2 1 3 4 5 10 21 54 24 i
- Quicksort(A,6,5) 1 3 4 5 10 21 54 24 j=5 i=6 Quicksort(A,7,8) 1 3 4 5 10 21 54 24 i
- Thời gian chạy • Thủ tục partition kiểm tra tất cả các phần tử trong mảng nhiều nhất một lần, vì vậy nó mất thời gian tối đa là O(n). • Thủ tục partition sẽ chia phần mảng được sắp thành 2 phần. • Mặt khác cần chia liên tiếp n phần tử thành hai phần thì số lần chia nhiều nhất là log2n lần. • Vậy thời gian chạy của thuật toán QuickSort là O(nlogn) Sorting 16
- Thuật toán MergeSort Ý tưởng: • Giả sử ta có hai dãy A[i],..,A[k] và A[k+1],..,A[j] và hai dãy này đã được sắp. • Thực hiện trộn hai dãy trên để được dãy A[i],..,A[j] cũng được sắp • Do hai dãy A[i],..,A[k] và dãy A[k+1],..,A[j] đã được sắp nên việc trộn hai dãy thành một dãy được sắp là rất đơn giản. • Vậy trộn như thế nào? Sorting 17
- Ví dụ: Trộn hai dãy sau A … 1 3 24 4 21 54 … i k k+1 j Sorting 18
- Thuật toán trộn • Sử dụng hai biến left, right, t và sử dụng mảng phụ B[i],..,B[j]. left xuất phát từ i, right xuất phát từ k+1, t xuất phát tử i trên mảng phụ B. • Nếu A[left].keyk hoặc right>j thì dừng lại. Sorting 19
- Thuật toán trộn (tiếp) • Nếu left>k thì B[t]A[right],..,B[j]A[j]. • Nếu right>j thì B[t]A[left], B[t+1]A[letf+1],.., B[t+k-left]A[k]. • Gán A[i] B[i], .., A[j] B[j] Sorting 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p | 174 | 17
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p | 162 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 8: Cấu trúc dữ liệu ngăn xếp
28 p | 77 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Các kiểu dữ liệu trừu tượng cơ bản - Cấu trúc dữ liệu tuyến tính
92 p | 116 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây đỏ đen - Bùi Tiến Lên
25 p | 78 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 17: Cấu trúc dữ liệu dạng cây
21 p | 77 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p | 57 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p | 94 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (Trường Đại học Hồng Bàng )
62 p | 157 | 6
-
Bài giảng Cấu trúc dữ liệu - Chương 3: Cấu trúc cây
65 p | 58 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AA - Bùi Tiến Lên
30 p | 35 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 – Trần Minh Thái (2017)
67 p | 105 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây - Bùi Tiến Lên
68 p | 40 | 4
-
Bài giảng Cấu trúc dữ liệu: Chương 1 - ThS. Thiều Quang Trung (2018)
44 p | 43 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AVL - Bùi Tiến Lên
38 p | 46 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Ngô Quang Thạch
24 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Th.S Thiều Quang Trung
41 p | 68 | 3
-
Bài giảng Cấu trúc dữ liệu giải thuật: Cấu trúc dữ liệu
17 p | 50 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn