Chương TÌM KIẾM & SẮP XẾP 2.1 Các giải thuật tìm kiếm 2.1.1 Bài toán tìm kiếm 2.1.2 Giải thuật tìm kiếm tuyến tính 2.1.3 Giải thuật Tìm kiếm nhị phân 2.2 Các giải thuật xếp 2.2.1 Bài toán xếp 3.2.1 Giải thuật đổi chổ trực tiếp –Interchange Sort 3.2.2 Giải thuật chọn trực tiếp-Selection Sort 3.2.3 Giải thuật chèn trực tiếp-Insert Sort 3.2.4 Giải thuật bọt – Bubble Sort 3.2.5 Giải thuật nhanh – Quick Sort 2.3 Bài tập © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 2.1 Các Giải Thuật Tìm Kiếm 2.1.1 Bài toán tìm kiếm 2.1.2 Giải thuật tìm kiếm tuyến tính 2.1.3 Giải thuật Tìm kiếm nhị phân © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 2.1.1 Bài Toán Tìm Kiếm Trong thực tế, thao tác, khai thác liệu lúc phải thực thao tác tìm kiếm Kết việc tìm kiếm không tìm thấy tìm thấy Nếu kết tìm thấy nhiều phải xác định xem vị trí phần tử tìm thấy đâu? Việc tìm kiếm nhanh hay chậm tùy thuộc vào trạng thái trật tự liệu Có thuật toán chính: Tìm kiếm tuyến tính & Tìm kiếm nhị phân © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Giả sử có mảng M gồm N phần tử Vấn đề đặt có hay không phần tử có giá trị X mảng M? Nếu có phần tử có giá trị X phần tử thứ mảng M? © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 2.1.2 Giải Thuật Tìm Kiếm Tuyến Tính Ý Tưởng: Tiến hành so sánh x với phần tử thứ nhất, thứ hai…của mảng A gặp phần tử có khóa cần tìm, tìm hết mảng mà không thấy x Ưu điểm: Thuật toán cho ta thực tìm kiếm phần tử mảng chưa xếp Nhược điểm: Sẽ nhiều thời gian phần tử cần tìm © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Chưa hết mảng Tìm Tìmthấy thấy tạivịvịtrí tríthứ thứ 55 VD:Tìm x = 14 14 12 14 10 7 10 VD:Tìm x = 30 30 12 14 10 7 10 HếtChưa mảng hếttìm không mảng thấy © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Giải thuật: Bước : i = 1; // Bắt đầu từ phần tử dãy Bước : So sánh a[i] với x, có khả • a[i] = x ; // Tìm thấy.Dừng • a[i] != x ; // Thực bước Bước : • i = i+1; // xét phần tử mảng • Nếu i > N // Hết mảng.Không tìm thấy.Dừng Ngược lại: Lặp lại bước © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Cài Đặt Int Timtuyentinh (int a[] , int N , int x) { int i = 0; while((i < N) && (a[i] != x)) i++; if( i == N) return -1 ; // tìm hết mảng x else return i ; //a[i] phần tử có khóa x } Đánh giá giải thuật Độ phức tập tính toán cấp n: T(n)=O(n) © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 2.1.3 Giải Thuật Tìm Kiếm Nhị Phân Ý Tưởng: - Lần tìm kiếm ban đầu phần tử dãy (First = 1) đến phần tử cuối dãy (Last = N) - So sánh giá trị X với giá trị phần tử đứng dãy M M[Mid] - Nếu X = M[Mid]: Tìm thấy - Nếu X < M[Mid]: Rút ngắn phạm vi tìm kiếm nửa đầu dãy M (Last = Mid–1) - Nếu X > M[Mid]: Rút ngắn phạm vi tìm kiếm nửa sau dãy M (First = Mid+1) - Lặp lại trình tìm thấy phần tử có giá trị X phạm vi tìm kiếm không (First > Last) © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Ưu điểm: Thuật toán tìm nhị phân rút ngắn đáng kể thời gian tìm kiếm Nhược điểm: Chỉ thực dãy có thứ tự 10 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=1; j=8 L 10 R X=3 i 15 j L=1 R=8 65 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net Đoạn Đoạn L=1 R=3 L=4 R=8 Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=4; j=8 L 66 R X=5 15 L=4 R=8 i L=1 R=3 Đoạn Đoạn L=4 R=5 L=5 R=8 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net 10 j Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=5; j=8 L=5 R=8 L=4 R=5 L=1 R=3 67 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net L X=7 R 15 i 10 j Đoạn L=6 R=8 Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=6; j=8 L=6 R=8 68 L X=15 R 15 10 L=4 R=5 i L=1 R=3 Đoạn Đoạn cần xếp © Dương Thành Phết-www.thayphet.net j L=6 R=7 Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=6; j=7 X=15 L=6 R=7 L=4 R=5 L R 10 i j 15 L=1 R=3 69 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=4; j=5 X=5 L=4 R=5 L R i j 10 15 L=1 R=3 70 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần i=1; j=3 L X=2 R i 10 15 j L=1 R=3 71 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có phần tử Sắp xếp theo vi trí tăng dần 10 15 Không đoạn cần xếp 72 Đoạn cần xếp © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 15 15 10 15 10 Đoạn [6- 8] 10 15 Đoạn [6- 7] 10 Đoạn [1- 8] 10 Đoạn [4- 8] Đoạn [5- 8] Đoạn [4- 5] Đoạn [1- 3] 73 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Giải thuật: Bước 1: i=1; Bước 2: j=N; Trong (j>i) thực hiện: Nếu a[j]N-1: Hết dãy, dừng Ngược lại: Lặp lại Bước 74 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Cài Đặt 75 void QuickSort(int M[], int First, int Last) { int i, j, tam, x; x = M[(First+Last)/2]; i = First; j = Last; { while (M[i] X) j ; if (i [...]... trong dãy 21 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa 12 2 8 5 1 6 4 12 2 8 5 1 6 4 i=1 j =2 i =2 j=3 i=3 j=4 i=4 j=5 i=5 j=6 i=6 j=7 i=7 22 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 12 2 8 5 1 6 4 Lần 1 1 12 8 5 2 6 4 Lần 2 1 2 12 8 5 6 4 Lần 3 1 2 4 12 8 6 5 Lần 4 1 2 4 5 12 8 6 Lần 5 1 2 4 5 6 12 8 Lần 6 1 2 4 5 6 8 12 Ban đầu 23 © Dương... Trường ĐH KTKT B.Dương 2. 2 Các giải thuật sắp xếp 2. 2.1 Bài toán sắp xếp 2. 2 .2 Giải thuật đổi chổ trực tiếp –Interchange Sort 2. 2.3 Giải thuật chọn trực tiếp-Selection Sort 2. 2.4 Giải thuật chèn trực tiếp-Insert Sort 2. 2.5 Giải thuật nổi bọt – Bubble Sort 2. 2.6 Giải thuật nhanh – Quick Sort 18 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 2. 2.1 Bài Toán Sắp Xếp Để thuận tiện và... 23 Kết thúc vì mảng chỉ còn 1 phần tử 7 11 16 23 28 45 61 73 35 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Ban đầu 16 11 45 28 73 61 7 23 Lần 1 7 11 45 28 73 61 16 23 Lần 2 7 11 45 28 73 61 16 23 Lần 3 7 11 16 28 73 61 45 23 Lần 4 7 11 16 23 73 61 45 28 Lần 5 7 11 16 23 28 61 45 73 Lần 6 7 11 16 23 28 45 61 73 Lần 7 7 11 16 23 28 45 61 73 36 © Dương Thành Phết-www.thayphet.net... 28 73 61 7 23 Min 7 11 16 28 73 61 45 23 I=4 31 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 Min 7 11 16 23 73 61 45 28 I=5 32 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 Min 7 11 16 23 ... có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 45 28 73 61 16 23 Min 7 11 I =2 29 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 Min 7 11 45 28 73 61 16 23 I=3 30 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi... theo, tìm phần tử nhỏ nhất của dãy n-1 phần tử còn lại trong dãy đổi chổ cho phần tử thứ 2 của dãy Quá trình trên thực hiên đến khi nào trong mảng chỉ còn 1 phần tử thi dừng lại Kết quả được mảng đã sắp xếp tăng 27 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 Min 16 11 45 28 73 61 7 23 I=1 28 ...Minh Họa Tìm giá trị X = 85 (Tìm thấy) Mid = 5 M[mid]= 46 M F 17 12 23 34 46 L 59 69 77 85 90 X X > M[mid] 11 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Tìm giá trị X = 85 (Tìm thấy) Mid = 8 M[mid] = 77 F 7 12 23 34 46 59 M 69 L 77 85 90 X X > M[mid] 12 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Tìm giá trị X = 85 (Tìm thấy) Mid... 61 7 23 Min 7 11 16 23 28 61 45 73 I=6 33 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 Min 7 11 16 23 28 45 61 73 I=7 34 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần 16 11 45 28 73 61 7 23 Kết thúc vì mảng chỉ... 7 12 23 34 46 59 69 77 F L 85 90 X Đã tìm thấy tại vị trí 9 X = M[mid] 13 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương Minh Họa Giả sử dãy M gồm 10 phần tử có khóa như sau (N = 10) 2 3 4 5 8 15 17 22 25 30 Tìm kiếm phần tử có giá trị X = 5 (tìm thấy): Lần lặp First Last First>L X= X< Mid M[Mid] ast M[Mid] M[Mid] X> M[Mid] B.đầu 1 10 False 5 8 False True False 1 1 4 False 2 3... thao tác mà đặc biệt là để tìm kiếm Do vậy sắp xếp dữ liệu là một trong những thao tác cần thiết và thường gặp trong quá trình lưu trữ, quản lý dữ liệu Sắp xếp là quá trình xử lý một danh sách các phần tử để đặt chúng theo một thứ tự tăng hoặc giảm dựa trên nội dung lưu trữ trên mỗi phần tử Có rất nhiều thuật toán sắp xếp song chúng ta chỉ quan tâm đến 5 giải thuật sắp xếp thường sử dụng 19 © Dương ... B.Dương 2. 2 Các giải thuật xếp 2. 2.1 Bài toán xếp 2. 2 .2 Giải thuật đổi chổ trực tiếp –Interchange Sort 2. 2.3 Giải thuật chọn trực tiếp-Selection Sort 2. 2.4 Giải thuật chèn trực tiếp-Insert Sort 2. 2.5... Họa 12 12 i=1 j =2 i =2 j=3 i=3 j=4 i=4 j=5 i=5 j=6 i=6 j=7 i=7 22 © Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ĐH KTKT B.Dương 12 Lần 1 12 Lần 2 12 Lần 12 Lần 4 12 Lần 5 12 Lần 6 12 Ban.. .2. 1 Các Giải Thuật Tìm Kiếm 2. 1.1 Bài toán tìm kiếm 2. 1 .2 Giải thuật tìm kiếm tuyến tính 2. 1.3 Giải thuật Tìm kiếm nhị phân © Dương Thành Phết-www.thayphet.net