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.
Trang 1Các thu ậ t toán s ắ p 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
Trang 2Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 2
Trang 3Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 3
Thuật toán “Chọn trực tiếp”
(Selection sort Algorithm)
Thuật toán “Chọn trực tiếp”
(Selection sort Algorithm)
Trang 4Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 4
Selection sort Algorithm
Trang 5Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 5
Selection sort Algorithm
Trang 6Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 6
Selection sort Algorithm
Trang 7Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 7
Selection sort Algorithm
Trang 8Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 8
Selection sort Algorithm
Trang 9Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 9
Selection sort Algorithm
Trang 10Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 10
Selection sort Algorithm
Trang 11Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 11
Selection sort Algorithm
Tiếp tục
tương tự
Ph ần đ ã sắp tăng thêm
[0] [1] [2] [3] [4] [5]
Phần đã sắp Phần chưa sắp
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 12Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 12
Selection sort Algorithm
Trang 13Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 13
Selection sort Algorithm
Trang 14Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 14
Selection sort Algorithm
Trang 15Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 15
Selection sort Algorithm
(Minh họa chương trình)
Selection sort Algorithm
(Minh họa chương trình)
void SelectionSort (int a[ ], int n )
{
int min; // vị trí của phần tử nhỏ nhất (trong phần chưa sắp)
int tmp; // biến tạm dùng khi hoán vị
for (int i = 0; i < n; i++ ) {
// tìm phần tử nhỏ nhất trong phần chưa sắp min = i;
for (int j = i + 1; j < n; j++)
if (a[j] < a[min] ) min = j;
// hoán vị phần tử nhỏ nhất được tìm thấy với phần tử đầu
if (a[min] < a[i]) { tmp = a[i]; a[i] = a[min]; a[min] = tmp; } } // end of for i
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 16Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 16
Đánh giá thuật toán
(Selection sort Algorithm)
Đánh giá thuật toán
(Selection sort Algorithm)
Trong mọi trường hợp, số phép so sánh là:
Trang 17Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 17
Thuật toán “Chèn trực tiếp”
(Insertion sort Algorithm)
Thuật toán “Chèn trực tiếp”
(Insertion sort Algorithm)
Trang 18Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 18
Insertion sort Algorithm
Trang 19Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 19
Insertion sort Algorithm
Trang 20Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 20
Insertion sort Algorithm
Trang 21Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 21
Insertion sort Algorithm
Trang 22Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 22
Insertion sort Algorithm
Trang 23Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 23
Insertion sort Algorithm
Trang 24Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 24
Insertion sort Algorithm
Trang 25Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 25
Insertion sort Algorithm
Trang 26Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 26
Insertion sort Algorithm
Trang 27Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 27
Insertion sort Algorithm
Trang 28Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 28
Insertion sort Algorithm
Trang 29Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 29
Insertion sort Algorithm
Trang 30Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 30
Insertion sort Algorithm
Trang 31Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 31
Insertion sort Algorithm
Trang 32Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 32
Insertion sort Algorithm
Trang 33Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 33
Insertion sort Algorithm
Trang 34Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 34
Insertion sort Algorithm
Trang 35Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 35
Insertion sort Algorithm
(Minh họa chương trình)
Insertion sort Algorithm
(Minh họa chương trình)
void InsertionSort (int a[ ], int n)
Trang 36Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 36
Đánh giá thuật toán
(Insertion sort Algorithm)
Đánh giá thuật toán
(Insertion sort Algorithm)
Trang 37Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 37
“Ch èn trực tiếp” và “Chọn trực tiếp” đều có chi phí cho trường hợp xấu nhất là O(n 2 )
Do đó, không thích hợp cho việc sắp xếp các
mảng lớn
D ễ cài đặt, dễ kiểm lỗi
“Ch èn trực tiếp” tốt hơn “Chọn trực tiếp”,
Trang 38Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 38
Thuật toán “Shell sort”
(Shell sort Algorithm)
Thuật toán “Shell sort”
(Shell sort Algorithm)
Shell trên tạp chí Communication of the
ACM
Thuật toán này cải tiến hiệu quả của thuật
toán “Chèn trực tiếp”
Phá vỡ rào cản chi phí O(n 2 ) của những
thuật toán sắp xếp trước đó
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 39Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 39
Shell sort Algorithm
Trang 40Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 40
Shell sort Algorithm
Trang 41Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 41
Shell sort Algorithm
Chia dãy thành h=3 dãy con
Sắp xếp 3 dãy con bằng phương pháp “Chèn trực tiếp”
Trang 42Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 42
Shell sort Algorithm
Sắp xếp 1 dãy con bằng phương pháp “Chèn trực tiếp”
Trang 43Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 43
Shell sort Algorithm
Thuật toán sử dụng 1 dãy h k :
h 1 , h 2 , h 3 , …, h t
(*) Tính chất dãy h k :
h i > h i+1 (dãy giảm dần)
h t = 1
Dãy h k gọi là dãy “gia số” (Increment sequence),
dùng để tạo lập các dãy con trong mảng ban đầu
Trong ví dụ: h 1 = 5, h 2 = 3, h 3 = 1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 44Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 44
Shell sort Algorithm
Vấn đề: Lựa chọn dãy gia số h k như thế nào ?
Mọi dãy h k thoả mãn tính chất (*) đều chấp nhận được;
Tuy nhiên, cho đến nay, người ta chỉ có thể chỉ ra rằng dãy h k này tốt hơn dãy h k kia, chứ không thể xác định được dãy nào là tốt nhất
Chi phí c ủ a thu ậ t toán Shell sort ph ụ
th ụ ôc vào 2 v ấ n đề chính là :
Cách thức xây dựng dãy h k
Dữ liệu nhập
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 45Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 45
Shell sort Algorithm
Các chiến lược xây dựng dãy h k đã được khảo sát:
Trang 46Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 46
Shell sort Algorithm
(Minh họa chương trình)
Shell sort Algorithm
(Minh họa chương trình)
void ShellSort(int h[], int a[], int t, int n)
{
for (int k=0; k<t; k++) {
int increment = h[k];
for (int i=increment; i<n; i++) {
int saved = a[i];
for (int j=i; j>=increment && saved<a[j-increment];
j-=increment) a[j] = a[j-increment];
a[j] = saved;
} }
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 47Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 47
Đánh giá thuật toán
(Shell sort Algorithm)
Đánh giá thuật toán
(Shell sort Algorithm)
Việc phân tích giải thuật này đặt ra những vấn đề toán học hết sức phức tạp mà trong đó có 1 số vấn
đề đến nay vẫn chưa được giải quyết
Ngườ i ta vẫn chưa biết chọn dãy h k như thế nào
là phù hợp để cho ra kết quả tốt nhất
Một số kết quả đã chứng minh:
Shell sort với dãy h k của Donald Shell có số phép gán
trong tr ườ ng h ợ p x ấ u nh ấ t là O(n 2 )
Sử dụng dãy h k của Hibbard cần dùng O(n 3/2 ) phép gán
Chi phí khi dùng dãy h k của Pratt là O(n(log 2 n) 2 )
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 48Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 48
Thuật toán “Sắp xếp cây”
(Heap sort Algorithm)
Thuật toán “Sắp xếp cây”
(Heap sort Algorithm)
trên tạp chí Communication of the ACM
Đây là thuật toán sắp xếp chậm nhất trong số các
thuật toán có độ phức tạp O(n*log 2 n)
Nhưng nó lại đạt được ưu điểm vì tính đơn giản
của cài đặt không đòi hỏi vòng đệ qui phức tạp
như của Quicksort và không sử dụng mảng phụ
như Mergesort
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 49Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 49
Heap sort Algorithm
Nội dung
Heap sort Algorithm
Nội dung
Biểu diễn Heap bằng mảng (array)
Thao tác cơ bản trên Heap
Thuật toán Heap sort
Đánh giá thuật toán
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 50Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 50
Heap sort Algorithm
21 27
23
45
35
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 51Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 51
Heap sort Algorithm
21 27
Trang 52Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 52
Heap sort Algorithm
Trang 53Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 53
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Ta sẽ lưu giá trị
của các nút trong
một array
21 27
23
42
35
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 54Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 54
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Trang 55Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 55
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Giá trị của hai nút
con của gốc được
điền vào hai vị trí
tiếp theo
21 27
Trang 56Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 56
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Giá trị của hai nút ở
Trang 57Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 57
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Liên kết giữa các nút được
hiểu ngầm, không trực tiếp
Trang 58Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 58
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Nếu ta biết được chỉ số của
Trang 59Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 59
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Heap sort Algorithm
Biểu diễn Heap bằng mảng
Nút gốc ở chỉ số [0]
Nút cha của nút [i] có chỉ số là [(i-1)/2]
Các nút con của nút [i] (nếu có) có chỉ số
Trang 60Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 60
Heap sort Algorithm
Thao tác cơ bản trên Heap
Heap sort Algorithm
Thao tác cơ bản trên Heap
21 35
Trang 61Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 61
Heap sort Algorithm
Thao tác cơ bản trên Heap
Heap sort Algorithm
Thao tác cơ bản trên Heap
21 27
Trang 62Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 62
Heap sort Algorithm
Thao tác cơ bản trên Heap
Heap sort Algorithm
Thao tác cơ bản trên Heap
4 22
21 34
23
42
35
28 27
Heapify - Điều chỉnh 1 phần tử
Hoàn tất !
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 63Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 63
Heap sort Algorithm
Thao tác cơ bản trên Heap
Heap sort Algorithm
Thao tác cơ bản trên Heap
void Heapify(int a[], int n, int i) // Điều chỉnh phần tử a[i]
{
int saved = a[i]; // lưu lại giá trị của nút i
while (i < n/2) { // a[i] không phải là nút lá
int child = 2*i + 1; // nút con bên trái của a[i]
if (child < n-1)
if (a[child] < a[child+1]) child ++;
if (saved >= a[child]) break;
Trang 64Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 64
Heap sort Algorithm
Thuật toán Heap sort
Heap sort Algorithm
Thuật toán Heap sort
Xây dựng Heap: Sử dụng thao tác Heapify
để chuyển đổi một mảng bình thường thành
Heap
Sắp xếp:
Hoán vị phần tử cuối cùng của Heap với phần
tử đầu tiên của Heap (có giá trị lớn nhất)
Loại bỏ phần tử cuối cùng
Thực hiện thao tác Heapify để điều chỉnh phần
tử đầu tiên
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 65Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 65
Heap sort Algorithm
Thuật toán Heap sort - Xây dựng Heap
Heap sort Algorithm
Thuật toán Heap sort - Xây dựng Heap
Tất cả các phần tử trên mảng có chỉ số [n/2]
đến [n-1] đều là nút lá
Mỗi nút lá được xem là Heap có một phần tử
Thực hiện thao tác Heapify trên các phần tử
có chỉ số từ [n/2]-1 đến [0]
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 66Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 66
Heap sort Algorithm
Thuật toán Heap sort - Xây dựng Heap
Heap sort Algorithm
Thuật toán Heap sort - Xây dựng Heap
Thực hiện Heapify với tất
cả các nút không phải là lá
Theo thứ tự từ trái sang
phải
17 14
Trang 67Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 67
Heap sort Algorithm
Thuật toán Heap sort - Xây dựng Heap
Heap sort Algorithm
Thuật toán Heap sort - Xây dựng Heap
Trang 68Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 68
Heap sort Algorithm
Thuật toán Heap sort - Sắp xếp
Heap sort Algorithm
Thuật toán Heap sort - Sắp xếp
void HeapSort(int a[], int n)
{
BuildHeap(a, n);
for (int i=n-1; i>=0; i ) {
Hoán vị a[0] với a[i]
Heapify(a, i, 0);
} }
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 69Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 69
Đánh giá thuật toán
(Heap sort Algorithm)
Đánh giá thuật toán
(Heap sort Algorithm)
Heap sort luôn có độ phức tạp là O(n*
log 2 n)
Quick sort thường có độ phức tạp là O(n* log 2 n) nhưng trường hợp xấu nhất lại có độ phức tạp O(n 2 )
Nhìn chung Quick sort nhanh hơn Heap sort
2 lần nhưng Heap sort lại có độ ổn định cao trong mọi trường hợp
CuuDuongThanCong.com https://fb.com/tailieudientucntt