Ý tưởng của phương pháp
- Ta chia đôi một dãy cần sắp thành 2 dãy con có chiều dài n/2, sau đó ta tiếp tục chia đôi 2 dãy con có chiều dài là n/2 thành các dãy con có chiều dài n/4,… cho đến khi mỗi dãy con chỉ còn lại chiều dài là 1.
- Ta tiến hành trộn (merge) các cặp dãy có chiều là 1 để tạo thành các dãy sắp xếp có chiều dài là 2, tiến hành trộn các cặp dãy có chiều dài là 2 để tạo thành các dãy sắp xếp có chiều là 4, …cho đến khi hai dãy có chiều dài n/2 được trộn để tạo thành dãy sắp xếp chung có chiều là n.
Giải thuật
void Merge(int *a,unsigned int L,unsigned int mid,unsigned int R) {
unsigned int i, j, k;
int *b=new int[R-L+1]; i=L;j=mid+1;k=0;
while(i<=mid && j<=R)
if(a[i]<=a[j]){b[k]=a[i];i++;k++;} else {b[k]=a[j];j++;k++;} while(i<=mid){b[k]=a[i];i++;k++;} while(j<=R){b[k]=a[j];j++;k++;} for(i=0;i<R-L+1;i++)a[i+L]=b[i]; delete b; }
void Merge_sort(int *a,unsigned int L, unsigned int R) {
if(L<R) {
unsigned int mid=(L+R)/2; Merge_sort(a,L,mid); Merge_sort(a,mid+1,R);
Merge(a,L,mid,R); }
}
Phân tích giải thuật Merge sort:
Độ phức tạp của giải thuật Merge sort là: = + = otherwise n if n n T n T 1 , ) 2 ( 2 , 1 ) (
Sử dụng phương pháp lặp tương tự phương pháp Quick sort, ta có: ) log ( log ) 1 ( ) (n n n O n n T = + = 6.2. Tìm kiếm
6.2.1. Tìm kiến tuần tự (Sequential searching)
Giả sử ta cần tìm trên một mảng nguyên A có n phần tử xem có phần tử nào có giá trị bằng x không.
Nội dung của phương pháp này đó là ta bắt đầu tìm kiếm từ phần tử đầu tiên. Nếu phần tử này không có giá trị bằng x thì ta tìm đến phần tử kế tiếp, và cứ như thế cho đến khi tìm thấy phần tử cần tìm hoặc đến khi hết danh sách.
Kết quả tìm kiếm sẽ trả về vị trí phần tử tìm thấy hoặc -1 (nếu không tìm thấy).
Giải thuật
int Sequential_search(int x, int *a, unsigned int n) {
for(int i=0; i<n; i++)
if(a[i]==x) return i;
return -1; }
Phân tích giải thuật tìm kiếm tuần tự:
Độ phức tạp của giải thuật tìm kiếm tuần tự là: T(n) = 1 ( )
0 n O nC C n i = = ∑− = , với C là hằng số nào đó.
6.2.2. Tìm kiến nhị phân (Binary searching)
Ý tưởng của phương pháp này là tìm kiếm giá trị x trên danh sách đã có thứ tự (giả sử danh sách đã có thứ tự tăng dần). Phương pháp này được thực hiện như sau:
Lấy giá trị của phần tử giữa trong danh sách rồi so sánh với x. Lúc này sẽ xảy ra 1 trong 3 trường hợp:
- Nếu bằng nhau thì trả về vị trí phần tử tìm thấy.
- Nếu phần tử giữa có giá trị nhỏ hơn x thì danh sách mới cần tìm sẽ nằm bên phải phần tử giữa.
- Nếu phần tử giữa có giá trị lớn hơn x thì danh sách mới cần tìm sẽ nằm bên trái phần tử giữa.
Quá trình trên được tiếp tục cho đến khi tìm thấy phần tử trong danh sách, hoặc danh sách cần tìm không còn phần tử nào.
Giải thuật
int Binary_search(int x,int *a, unsigned int L, unsigned int R) {
if(L<=R) {
unsigned int mid=(L+R)/2; if(a[mid]==x)return mid; else
if(a[mid]<x)return Binary_search(x,a, mid+1,R); else return Binary_search(x,a, L,mid-1);
}
else return -1; }
Bài tập cuối chương
1. Sắp xếp dãy số 3, 1, 4, 1, 5, 9, 2, 6, 5 bằng thuật toán chèn.
2. Thời gian thực hiện của thuật toán chèn như thế nào nếu tất cả các giá trị trong mảng đều bằng nhau.
3. Sắp xếp dãy số 3, 1, 4, 1, 5, 9, 2, 6 bằng thuật toán Merge sort. 4. Viết giải thuật Merge sort không sử dụng đệ quy.
5. Sắp xếp dãy số 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 bằng thuật toán Quick sort. 6. Viết hàm tìm kiếm giá trị x trên mảng nguyên n phần tử bằng thuật toán:
- Tìm kiếm tuần tự. - Tìm kiếm nhị phân.
TÀI LIỆU THAM KHẢO
[1] Ðỗ Xuân Lôi [1995]. "Cấu trúc dữ liệu và giải thuật". Nhà xuất bản khoa học và kỹ thuật. Hà nội, 1995.
[2] Aho, A. V. , J. E. Hopcroft, J. D. Ullman. "Data Structure and Algorihtms", 1983 [3] R. Sedgewick, ”Algorithms ", 1987.
[4] N. Wirth "Chương trình = cấu trúc dữ liệu + giải thuật", 1983. [5] Nguyễn trung Trực, "Cấu trúc dữ liệu". BK tp HCM, 1990.
MỤC LỤC
Trang
Chương 1. THUẬT TOÁN VÀ CẤU TRÚC DỮ LIỆU...1
1.1. Thuật và cấu trúc dữ liệu...1
1.1.1. Thuật toán (algorithm)...1
1.1.1.1. Định nghĩa thuật toán...1
1.1.1.2. Đặc trưng của thuật toán...1
1.1.2. Cấu trúc dữ liệu (data structure)...1
1.1.2.1. Khái niệm...1
1.1.2.2. Các loại cấu trúc dữ liệu...1
1.1.3. Ngôn ngữ diễn đạt thuật toán...1
1.1.3.1. Sử dụng ngôn ngữ tự nhiên...2
1.1.3.2. Sử dụng sơ đồ khối...2
1.1.3.3. Sử dụng ngôn ngữ giả (pseudo code)...3
1.2. Giải thuật đệ quy...3
1.2.1. Khái niệm về đệ quy...3
1.2.2. Giải thuật và thủ tục đệ quy...3
1.2.3. Thiết kế giải thuật đệ quy...4
1.2.4. Hiệu lực của đệ quy...7
1.3. Độ phức tạp của thuật toán...8
1.3.1. Phân tích thuật toán...8
1.3.1.1. Tính hiệu quả của thuật toán...8
1.3.3.2. Đánh giá thời gian thực hiện của thuật toán...8
1.3.2. Độ phức tạp tính toán của giải thuật...9
1.3.2.1. Định nghĩa...9
1.3.2.2. Xác định độ phức tạp tính toán...10
1.3.2.3. Đánh giá độ phức tạp của thủ tục (hoặc hàm) đệ qui...11
1.3.2.4. Một số ví dụ...11
Bài tập cuối chương...13
...14
Chương 2. DANH SÁCH (List)...15
2.1. Kiểu dữ liệu trừu tượng danh sách (List Abstract Data Type)...15
2.1.1. Định nghĩa danh sách...15
2.1.2. Các phép toán trên danh sách...15
2.2. Danh sách đặc (condensed list)...15
2.2.1. Định nghĩa danh sách đặc...15
2.2.2. Cài đặt danh sách đặc bởi mảng...15
2.2.3. Các phép toán trên danh sách...16
2.2.3.1. Khởi tạo danh sách...16
2.2.3.2. Kiểm tra danh sách có rỗng không...16
2.2.3.3. Kiểm tra danh sách có đầy không...16
2.2.3.4. Thêm một phần tử vào danh sách...16
2.2.3.5. Loại bỏ một phần tử khỏi danh sách...16
2.2.3.6. Tìm kiếm một phần tử trong danh sách...16
2.2.4. Đặc điểm của danh sách đặc...17
2.2.4.1. Ưu điểm...17
2.2.4.2. Nhược điểm...17
2.3. Danh sách liên kết đơn (single linked list)...17
2.3.1. Định nghĩa...17
2.3.3. Các phép toán trên danh sách liên kết đơn...18
2.3.3.1. Khởi tạo danh sách liên kết đơn...18
2.3.3.2. Chèn một phần tử vào danh sách liên kết đơn...18
2.3.3.3. Xóa một phần tử khỏi danh sách liên kết đơn...21
2.3.3.4. Tìm kiếm trong danh sách liên kết đơn...22
2.3.3.5. In ra màn hình giá trị các phần tử trong danh sách liên kết đơn...22
2.3.3.6. Sắp xếp trong danh sách liên kết đơn...22
2.3.3.7. Ví dụ về danh sách liên kết đơn...23
2.3. Danh sách liên kết đơn vòng (circular linked list)...24
2.3.1. Định nghĩa...24
2.3.2. Biểu diễn danh sách liên kết vòng...24
2.3.3.1. Khởi tạo danh sách liên kết vòng...24
2.3.3.2. Chèn một phần tử vào danh sách liên kết vòng...25
2.3.3.3. Tìm kiếm phần tử trong DSLK vòng có nội dung là x...25
2.3.3.4. Xoá các phần tử trong DSLK vòng có nội dung là x...25
2.3.3.5. In các phần tử trong DSLK vòng ra màn hình...25
2.3.3.6. Ví dụ về danh sách liên kết vòng...26
2.4. Danh sách liên kết kép (Double Linked List)...27
2.4.1. Định nghĩa...27
2.4.2. Biểu diễn danh sách liên kết kép...27
2.4.3. Các thao tác trên danh sách liên kết kép...28
2.3.3.1. Khởi tạo danh sách liên kết kép...28
2.3.3.2. Chèn một phần tử vào danh sách liên kết kép...28
2.3.3.3. Xoá phần tử có giá trị x trong danh sách liên kết kép...29
2.3.3.4. In ấn các phần tử trong danh sách liên kết kép...30
2.3.3.5. Ví dụ về danh sách liên kết kép...30
Bài tập cuối chương...31
Chương 3. NGĂN XẾP VÀ HÀNG ĐỢI...34
3.1. Kiểu cấu trúc dữ liệu trừu tượng stack (the stack abstract data type)...34
3.1.1. Định nghĩa stack...34
3.1.2. Biểu diễn stack...34
3.1.3. Các phép toán trên stack...35
3.1.4. Ví dụ...36
3.2. Kiểu cấu trúc dữ liệu trừu tượng Queue (the queue abstract data type)...38
3.2.1. Định nghĩa Queue...38
3.2.2. Biểu diễn queue...38
3.2.3. Các phép toán trên queue...38
3.2.4.Queue vòng (circular queue)...40
Bài tập cuối chương...42
Chương 4. CÂY (TREES)...44
...44
4.1. Một số khái niệm...44
4.1.1. Một số khái niệm...44
4.1.1.1. Định nghĩa cây...44
4.1.1.2. Bậc của nút và bậc của cây...44
4.1.1.3. Nút kết thúc và nút trung gian...44
4.1.1.4. Mức (level) của nút và chiều cao của cây...44
4.1.1.5. Nút trước và nút sau...45
4.1.1.6. Nút cha và nút con (ancester and descendant)...45
4.1.1.7. Cây có thứ tự (ordered tree)...45
4.1.1.8. Chiều dài đường đi (path length)...45
4.1.2. Các cách biểu diễn cây...46
4.1.2.1. Biểu diễn bằng đồ thị...46
4.1.2.2. Biểu diễn bằng giản đồ Ven...46
4.1.2.3. Biểu diễn bằng các dấu ngoặc lồng nhau...47
4.1.2.4. Biểu diễn bằng phương pháp thụt dòng...47
4.1.2.5. Biểu diễn bằng chỉ số...47
4.2. Cách chứa cây trong bộ nhớ...47
4.3. Cây nhị phân (Binary Tree)...48
4.3.1. Khởi tạo cây...49
4.3.2. Các phép duyệt cây nhị phân...49
4.3.2.1. Duyệt theo thứ tự trước (NLR)...49
4.3.2.2. Duyệt theo thứ tự giữa (LNR)...49
4.3.2.3. Duyệt theo thứ tự sau (LRN)...50
4.3.3. Tạo cây nhị phân bất kỳ...50
4.3.4. Tìm kiếm nút chứa giá trị x trên cây nhị phân...50
4.3.5. Ví dụ về cây nhị phân...50
4.4. Cây nhị phân tìm kiếm (cây-BST: Binary Search Tree)...51
4.4.1. Định nghĩa...51
4.4.2. Cài đặt cây nhị phân tìm kiếm...52
4.4.3.Các thao tác cơ bản trên cây nhị phân tìm kiếm...52
4.4.3.1. Khởi tạo cây...53
4.4.3.2. Chèn một nút vào cây BST...53
4.4.3.3. Loại bỏ nút trên cây nhị phân tìm kiếm...53
4.4.3.4. Ví dụ...55
4.5. Cây cân bằng (Balanced Tree)...56
4.5.1. Định nghĩa...56
4.5.2. Khai báo và biểu diễn cây cân bằng...57
4.5.3. Các phép toán trên cây cân bằng...57
4.5.3.1. Khởi tạo cây cân bằng...57
4.5.3.2. Chèn một nút vào cây cân bằng...57
4.5.3.3. Tìm kiếm trên cây cân bằng...58
4.5.3.4. Xóa nút trên cây cân bằng...58
4.5.3.5. Ví dụ...59
Bài tập cuối chương...61
Chương 5. ĐỒ THỊ...63
5.1. Các khái niệm cơ bản...63
5.1.1. Định nghĩa...63
5.1.2. Các thuật ngữ...64
5.1.3. Đường đi, chu trình, đồ thị liên thông...64
5.1.3.1. Đường đi...64
5.1.3.2. Chu trình...64
5.1.3.3. Đồ thị liên thông...64
Đồ thị G’...64
5.2. Biểu diễn đồ thị trên máy tính...65
5.2.1. Ma trận kề, ma trận trọng số...65
5.2.2. Danh sách kề...66
5.3. Tìm kiếm trên đồ thị...67
5.3.1. Tìm kiếm theo chiều sâu trên đồ thị...67
5.3.2. Tìm kiếm theo chiều rộng trên đồ thị...68
Bài tập cuối chương...69
Chương 6. SẮP XẾP VÀ TÌM KIẾM...70
6.1.1. Các phương pháp sắp xếp cổ điển...70
6.1.1.1. Phương pháp sắp xếp chèn (Insertion sort)...70
6.1.1.2. Phương pháp sắp xếp nổi bọt (bubble sort)...71
6.1.1.3. Phương pháp sắp xếp chọn (Selection sort)...71
6.1.2. Các phương pháp sắp xếp nhanh...72
6.1.2.1. Phương pháp sắp xếp Quick sort...72
6.1.2.2. Phương pháp sắp xếp Merge sort...73
6.2. Tìm kiếm...74
6.2.1. Tìm kiến tuần tự (Sequential searching)...74
6.2.2. Tìm kiến nhị phân (Binary searching)...74