Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
1,11 MB
Nội dung
Cấu trúc liệu & Giải thuật (Data Structures and Algorithms) Các thuật toán xếp (Sorting algorithms) Sắp xếp mảng số ngun • Giả sử có mảng gồm số nguyên Ta cần xếp phần tử mảng theo thứ tự tăng dần 70 60 50 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Thuật toán “Chọn trực tiếp” (Selection sort Algorithm) • Bắt đầu cách tìm 70 phần tử nhỏ 60 50 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Selection sort Algorithm • Hốn vị phần tử nhỏ tìm với phần tử mảng 70 60 50 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Selection sort Algorithm Phần Phần chưa 70 • phần mảng xếp 60 50 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Selection sort Algorithm Phần Phần chưa 70 • Tìm phần tử nhỏ phần chưa 60 50 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Selection sort Algorithm Phần Phần chưa 70 • Hốn vị phần 60 tử nhỏ 50 phần 40 chưa 30 với phần 20 tử 10 phần 09/2013 [1] [0] [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Selection sort Algorithm Phần Phần chưa 70 • Phần xếp mảng tăng thêm phần tử 60 50 40 30 20 10 [1] 09/2013 [2] [3] [4] [5] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] Selection sort Algorithm Phần Phần chưa 70 • Tiếp tục tương tự 60 Phần tử 50 nhỏ 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] Selection sort Algorithm Phần Phần chưa 70 • Tiếp tục tương tự 60 50 40 30 20 10 [1] [0] 09/2013 [2] [1] [3] [2] [4] [3] [5] [4] Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM [6] [5] 10 Đánh giá thuật tốn (Merge sort Algorithm) Trộn dãy có kích thước n/2: O(n) Trộn dãy có kích thước n/4: O(n) O(log2n) lần Trộn n dãy có kích thước 1: O(n) 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 89 Đánh giá thuật tốn (Merge sort Algorithm) • Chi phí O(n*log2n) để xếp dãy • Sử dụng vùng nhớ trung gian O(n) phần tử • Có độ ổn định cao (khơng bị ảnh hưởng thứ tự ban đầu liệu) 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 90 Thuật toán “Sắp xếp nhanh” (Quick sort Algorithm) • Quick sort thuật tốn “chia để trị” • Ý tưởng: – Chia dãy cần thành phần – Cách “chia” Quick sort khác với cách chia Merge sort: ½ dãy bên trái chứa giá trị nhỏ ½ dãy bên phải – Thực việc xếp dãy (đệ qui) 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 91 Quick sort Algorithm Minh họa chương trình void QuickSort(int a[], int Left, int Right) { // Chỉ xử lý dãy có > phần tử if (Left < Right) { int m1, m2; // chia dãy (Left, Right) thành dãy Partition(a, Left, Right, m1, m2); QuickSort(a, Left, m1); // dãy bên trái QuickSort(a, m2, Right); // dãy bên phải } } 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 92 Quick sort Algorithm Cách chia thành dãy (Partition) Chọn phần tử làm “chuẩn”, thường ta chọn phần tử dãy 12 10 11 Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 93 Quick sort Algorithm Cách chia thành dãy (Partition) Bắt đầu so sánh phần tử từ đầu dãy với phần tử chuẩn… 12 10 11 high low Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 94 Quick sort Algorithm Cách chia thành dãy (Partition) …tìm phần tử “sai vị trí” phía bên phải… 12 10 11 high low Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 95 Quick sort Algorithm Cách chia thành dãy (Partition) …tìm thêm phần tử “sai vị trí” phía bên trái… 12 10 11 high low Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 96 Quick sort Algorithm Cách chia thành dãy (Partition) …hoán vị phần tử cho nhau, lại tiếp tục… 12 10 low 11 12 high Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 97 Quick sort Algorithm Cách chia thành dãy (Partition) …tìm thấy phần tử “sai vị trí” mới… 43 10 low 11 12 high Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 98 Quick sort Algorithm Cách chia thành dãy (Partition) …hoán vị cho nhau, tiếp tục… 34 10 10 11 12 low high Phần tử “chuẩn” 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 99 Quick sort Algorithm Cách chia thành dãy (Partition) …low > high kết thúc q trình phân chia ½ dãy bên trái 34 58 ½ dãy bên phải 58 10 11 12 high low (m1) (m2) 09/2013 Data Structures & Algorithms - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 100 Quick sort Algorithm Partition – Minh họa chương trình void Partition(int a[], int Left, int Right, int &m1, int &m2) { int Pivot = a[(Left+Right)/2]; // phần tử “chuẩn” int low = Left, high = Right; while (low < high) { while (a[low] < Pivot) low++; while (a[high] > Pivot) high ; if (low