Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Các thuật toán sắp xếp cung cấp cho người đọc các kiến thức: Bài toán sắp xếp, các phương pháp sắp xếp, selection sort, insertion sort,.... Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1CÁC THUẬT TOÁN SẮP XẾP
Bùi Tiến Lên01/01/2017
Trang 2Bài toán sắp xếp
là một trong những công việc phổ biến
Trang 3Bài toán sắp xếp (cont.)
Định nghĩa 1
Cho một dãy a có n phần tử có thứ tự Hãy sắp xếp dãy
{a0,a1, ,an−1}theo thứ tự tăng dần
Spring 2017 Data structure & Algorithm 3
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 4Các phương pháp sắp xếp
Có rất nhiều phương pháp sắp xếp khác nhau Mỗi phương pháp
có những đặc điểm riêng
Spring 2017 Data structure & Algorithm 4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 5SELECION SORT
Trang 6Selection Sort
Ý tưởng của thuật toán như sau: Giả sử dãy a được chia làm hai
phần: phần trên trái đã sắp xếp s và phần bên phải chưa sắp
xếp u
1. s = ∅ và u = a
Spring 2017 Data structure & Algorithm 6
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 7Selection Sort (cont.)
1 void SelectionSort(int a[], int n)
Trang 9INSERTION SORT
Trang 10Insertion Sort
Ý tưởng của thuật toán như sau: Giả sử dãy a được chia làm hai
phần: phần trên trái đã sắp xếp s và phần bên phải chưa sắp
xếp u
1. s = ∅ và u = a
Spring 2017 Data structure & Algorithm 10
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 11Insertion Sort (cont.)
1 void InsertionSort(int a[], int n)
Trang 13BUBBLE SORT
Trang 14Bubble Sort
Thuật toán Bubble Sort là một trường hợp cụ thể của SelectionSort Giai đoạn tìm phần tử nhỏ nhất được thực hiện bằng cách
làm cho phần tử nhỏ nhất nổi ra phía đầu của dãy u
Spring 2017 Data structure & Algorithm 14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 15Bubble Sort (cont.)
Trang 17SHELL SORT
Trang 18Shell Sort
trước
Ý tưởng của thuật toán
a0,a0+h,a0+2h,
a1,a1+h,a1+2h,
a2,a2+h,a2+2h,
trực tiếp Insertion Sort
Spring 2017 Data structure & Algorithm 18
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 19Shell Sort (cont.)
Thuật toán sẽ
ht= 1
Trang 21HEAP SORT
Trang 22Heap Sort
Định nghĩa 2
Cây heap là một cây nhị phân bộ phận hoàn chỉnh
các con của nó
con của nó
Spring 2017 Data structure & Algorithm 22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 23Biểu diễn Heap bằng mảng
Ta có thể biểu diễn cây nhị phân đầy đủ bằng mảng Ví dụ sau sẽminh họa cách biểu diễn một dãy gồm có 6 phần tử
{a0,a1,a2,a3,a4,a5} bằng cây nhị phân đầy đủ
Spring 2017 Data structure & Algorithm 23
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 24Biểu diễn Heap bằng mảng (cont.)
Trang 25Thao tác điều chỉnh cây nhị phân thành Heap
Xét một nút trên cây
thì tiến hành đổi chỗ với nút con có giá trị lớn nhất
Spring 2017 Data structure & Algorithm 25
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 26Cài đặt hiệu chỉnh cây
Sau đây là một hàm cài đặt bằng C cho thao tác hiệu chỉnh câythành Heap
1 void Heapify(int a[], int n, int i)
Trang 27Thuật toán Heap Sort
Thuật toán sắp xếp Heap Sort
chuyển một mảng bình thường thành một mảng Heap
đầu tiên của Heap
mảng HeapKhi xây dựng mảng Heap hãy lưu ý một số điểm sau
Trang 28Thuật toán Heap Sort (cont.)
Chương trình 1:Sau đây là cài đặt thuật toán hàm xây dựng mảng Heap
1 void BuildHeap(int a[], int n)
Trang 29Thuật toán Heap Sort (cont.)
Chương trình 2:Sau đây là cài đặt thuật toán sắp xếp
1 void HeapSort(int a[], int n)
Trang 31MERGE SORT
Trang 32Merge Sort
Hàm MergeSort nhận một danh sách có độ dài n và trả về một
danh sách đã được sắp xếp Hàm Merge nhận hai danh sách đã
được sắp L1 và L2 mỗi danh sách có độ dài n/2, trộn chúng lại với nhau để được một danh sách gồm n phần tử có thứ tự.
Trang 33Minh họa hoạt động Merge Sort
Sắp xếp danh sách L gồm 8 phần tử {7, 4, 8, 9, 3, 1, 6, 2}
Spring 2017 Data structure & Algorithm 33
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 35QUICK SORT
Trang 36Quick Sort
Ý tưởng của thuật toán như sau: Đây cũng là một hướng tiếp cận
”chia nhỏ bài toán”
sao cho các phần tử thuộc dãy trái đều nhỏ hơn các phần tửthuộc dãy bên phải
Spring 2017 Data structure & Algorithm 36
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 37Quick Sort (cont.)
Chương trình 3:Sau đây là cài đặt hàm Quick Sort
9 return Join(QuickSort(aleft), QuickSort(aright)
Trang 39RADIX SORT
Trang 40thứ i thành một nhóm đây là bước phân bố
nhất Quá trình phân bố-kết hợp được thực hiện cho đến khihết các chữ số
phải qua trái và Most significant digit đi từ trái qua phải
Spring 2017 Data structure & Algorithm 40
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 41Cài đặt
1 void RadixSort(int a[], int n)
2 {
4 const int radix = 10;
5 const int digits = 6;
6 Queue < long > queues[radix];
7 for (i = 0, factor = 1; i < digits; factor *= radix
Trang 42Minh họa thuật toán
Trang 43Minh họa thuật toán (cont.)
Trang 44Minh họa thuật toán (cont.)
Trang 45Minh họa thuật toán (cont.)
Trang 47COUNTING SORT
Trang 49Cài đặt
1 const int RANGE = 256;
2 void countSort(int a[], int n)
Trang 50Tài liệu tham khảo
Shell, D L (1959)
A high-speed sorting procedure
Communications of the ACM, 2(7):30–32.
Spring 2017 Data structure & Algorithm 50
CuuDuongThanCong.com https://fb.com/tailieudientucntt