Bài giảng Cấu trúc dữ liệu và giải thuật: Các thuật toán sắp xếp trình bày các kiến thức về sắp xếp 1 mảng các số nguyên, selection sort algorithm, insertion sort algorithm, thuật toán “Shell sort, đánh giá thuật toán,... Mời các bạn cùng tham khảo.
Các thuật toán xếp (Sorting algorithms) Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@fit.hcmus.edu.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt Sắp xếp mảng số nguyên 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 [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Thuật toán “Chọn trực tiếp” (Selection sort Algorithm) Bắt đầu cách tìm phần tử nhỏ [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Hoán vị phần tử nhỏ tìm với phần tử mảng [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Phần Phần chưa phần mảng xếp [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Phần Phần chưa Tìm phần tử nhỏ phần chưa [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Phần Hoán vị phần tử nhỏ phần chưa với phần tử phần Spring 2009 [0] Phần chưa [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Phần Phần chưa Phần xếp mảng tăng thêm phần tử [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Phần Phần chưa Tiếp tục tương tự Phần tử nhỏ [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt Selection sort Algorithm Phần Phần chưa Tiếp tục tương tự [0] Spring 2009 [1] [2] [3] [4] [5] Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 10 Đánh giá thuật toá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) Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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) Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 90 Thuật toán “Sắp xếp nhanh” (Quick sort Algorithm) Quick sort thuật toá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) Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 } } Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 low 11 high Phần tử “chuẩn” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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” Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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) Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM CuuDuongThanCong.com https://fb.com/tailieudientucntt 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