Chương này trình bày các thuật toán tìm kiếm và các thuật toán sắp xếp. Những nội dung chính trong chương này gồm có: Tìm kiếm tuyến tính, tìm kiếm nhị phân, cài đặt thuật toán, sắp xếp chọn trực tiếp – Selection Sort, sắp xếp chèn trực tiếp – Insertion Sort, sắp xếp nổi bọt – Bubble Sort, sắp xếp phân hoạch – Quick Sort. Mời tham khảo.
I Định nghĩa: CHƯƠNG II: II Các thuật toán bản: ! Các thuật tốn: – Tìm kiếm tuyến tính – Tìm kiếm nhị phân ! Tìm kiếm kỹ thuật tìm kiếm phần tử x có mặt dãy phần tử có hay khơng? CÁC THUẬT TỐN TÌM KIẾM – Tìm thấy trả lại vị trí – Khơng tìm thấy trả lại giá trị -1 X=5 8/4/16 X=9 8/4/16 CTDL – CNTH – Viện ĐH Mở tưởng: ! Minh ! Lần lượt duyệt từ đầu mảng đến cuối mảng, lần so sánh phần tử cần tìm x với phần tử tương ứng mảng (a[i]) họa tìm x =9 ! 11 41 32 13 14 3 Đã Chưa tìm thấy hếttại vị mảng trí họa tìm x =27 27 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 11 41 32 13 14 3 Chưa Đã hết hết mảng mảng phức tạp là: O(n) Đ/n hàm LineSearch – Input: – phần tử x ! mảng a có n phần tử Output: ! vị trí tìm thấy phần tử x ! trả lại giá trị -1 khơng tìm thấy ! CTDL – Khoa CNTH – Viện ĐH Mở A. Ý tưởng ! Xét dãy có thứ tự (tăng giảm) ! So sánh giá trị x với phần tử dãy tìm kiếm hành Dựa vào giá trị định giới hạn dãy tìm kiếm bước nửa trước hay nửa sau dãy hành 8/4/16 Thuật tốn tìm kiếm nhị phân d Đánh giá thuật toán: ! Độ 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở c Cài đặt thuật toán: ! Minh 8/4/16 b Minh họa thuật toán Thuật tốn tìm kiếm tuyến tính: a. Ý CTDL – Khoa CNTH – Viện ĐH Mở b Minh họa thuật tốn Minh họa tìm x = 41 x x x 14 16 19 22 41 46 51 63 71 10 l m m Tìm thấyr x vị trí m 10 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 10 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở c Mơ tả thuật tốn: ! Input: Minh họa tìm x = 45 x x x x 14 16 19 22 41 46 51 63 71 10 l m m r m 8/4/16 – phần tử x ! mảng a có n phần tử Output: ! vị trí tìm thấy phần tử x ! trả lại giá trị -1 khơng tìm thấy 8/4/16 ! Bước left ≤ right ⇒ quay lại bước để tìm kiếm tiếp " Ngược lại ⇒ Dãy hành hết phần tử (khơng tìm thấy) dừng thuật tốn CTDL – Khoa CNTH – Viện ĐH Mở # Nhận xét: CTDL – Khoa CNTH – Viện ĐH Mở 13 Cho dãy số a: a=2 tìm xem phần tử x = có dãy khơng? u cầu mơ tả chạy bước theo thuật tốn 15 8/4/16 Right Middle thuật tìm nhị phân dựa vào quan hệ giá trị phần tử mảng để định hướng trình tìm kiếm, áp dụng cho dãy có thứ tự – Giải thuật tìm nhị phân tiết kiệm thời gian nhiều so với giải thuật tìm Tnhị phân (n) = O(log n) < Ttuần tự (n) = O(n) 19 CTDL – Khoa CNTH – Viện ĐH Mở ! Tìm phần tử x=4 dãy sau: ! Tìm phần tử x = dãy sau: 10 Yêu cầu: mô tả bước thuật tốn tìm kiếm nhị phân Trạng thái CTDL – Khoa CNTH – Viện ĐH Mở 18 # Nhận xét: – Giải 8/4/16 III Bài tập áp dụng: ! Left 3: " Nếu e Ví dụ minh họa: ! 14 8/4/16 12 Đ/n hàm BinarySearch Input: = x ⇒ Tìm thấy => Dừng > x ⇒ right = middle – (tìm nửa đầu) " a[middle] < x ⇒ left = middle + (tìm nửa cuối) " a[middle] vị trí chứa phần tử x (nếu có) 11 CTDL – Khoa CNTH – Viện ĐH Mở – " a[middle] ! Output: d Cài đặt thuật tốn: ! ! Bước 1: Khởi đầu tìm kiếm tất phần tử dãy (left = right = n – 1) ! Bước 2: Tính middle = (left + right)/2 So sánh a[middle] với x Có khả năng: x – giá trị cần tìm n – số phần tử mảng a – mảng chứa phần tử xếp tăng dần left, right – số đầu số cuối mảng thực tìm l > r: Kết thúc Khơng tìm thấy m 11 * Các bước thực thuật toán: 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở CHƯƠNG III: CÁC THUẬT TOÁN SẮP XẾP – Khi muốn áp dụng giải thuật tìm nhị phân cần phải xét đến thời gian xếp dãy số để thỏa điều kiện dãy số có thứ tự Thời gian không nhỏ, dãy số biến động cần phải tiến hành xếp lại => khuyết điểm cho giải thuật tìm nhị phân – Cần cân nhắc nhu cầu thực tế để chọn hai giải thuật tìm kiếm cho có lợi 20 21 8/4/16 I Định nghĩa: II Các thuật toán phần tử a1, a2, …, an xếp trình bố trị lại phần tử theo thứ tự thỏa mãn tiêu chuẩn dựa nội dung thông tin lưu giữ phần tử 22 ! Cho ! Sắp ! Sắp ! Sắp 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở Sắp xếp chọn trực tiếp a Ý tưởng: ! Tại bước chọn phần tử nhỏ lớn số phần tử chưa xét đưa vị trí thích hợp, cố định phần tử khơng xét lại xếp chọn trực tiếp – Selection Sort xếp chèn trực tiếp – Insertion Sort ! Sắp xếp bọt – Bubble Sort ! Sắp xếp phân hoạch – Quick Sort ! Sắp xếp đổi chỗ trực tiếp – Interchange Sort ! Sắp xếp với số bước giảm dần – Heap Sort ! Sắp xếp trộn – Meger Sort 23 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 24 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở b Minh Họa Thuật Toán Chọn Trực Tiếp Hoandoi( a[0], a[4] ) Vị trí nhỏ đoạn(0,7) Vị trí nhỏ đoạn(1,7) Hoandoi(a[1], a[1]) Vị trí nhỏ đoạn(2,7) Hoandoi(a[2], a[6]) 12 15 12 15 12 15 7 i i i 25 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở Vị trí nhỏ đoạn(3, 7) 26 Hoandoi(a[3], a[3]) 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở Vị trí nhỏ đoạn (4, 7) 28 8/4/16 i CTDL – Khoa CNTH – Viện ĐH Mở 27 8/4/16 Hoandoi (a[4], a[5]) CTDL – Khoa CNTH – Viện ĐH Mở Vị trí nhỏ đoạn(6, 7) min 12 15 12 15 12 15 7 i 29 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở i 31 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở c Mơ tả thuật tốn: d Cài đặt thuật toán: ! Tổng quát xếp tăng dần ! Bước 1: i = vị trí đầu (i = 0) ! Bước 2: tìm số phần tử nhỏ dãy hành từ a[i] đến a[n-1] ! Bước 3: Hoán vị a[i] với a[min] ! Bước 4: ! void SelectionSort_Asc( int a[ ], int n ) { int min, i, j, tg; for( i=0 ; ii thực { Kết thúc a[j] < a[j-1] hốn đổi hai phần tử j=j–1 } ! Bước 3: i = i + Nếu i > n-2: dừng thuật toán Ngược lại: lặp lại bước 73 73 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 74 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở d Cài đặt thuật toán: ! Định nghĩa hàm BubbleSort_Asc – – Mảng a gồm n phần tử (nguyên) Output ! Mảng xếp (tăng dần) 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 77 Sắp xếp QuickSort 8/4/16 I CTDL – Khoa CNTH – Viện ĐH Mở 79 J Hoán đổi 8/4/16 Kết CTDL – Khoa CNTH – Viện ĐH Mở Phân hoạch dãy X – Chọn phần tử ngẫu nhiên dãy làm “chốt”, – Các phần tử dãy so sánh với “chốt” đổi chỗ cho Phân hoạch dãy X 5 i j i j 12 15 12 15 right left left phần tử nhỏ “chốt” xếp vào vị trí trước ! Mọi phần tử lớn “chốt” xếp vào vị trí sau right STOP STOP STOP STOP Khơng nhỏ x Không lớn x Không nhỏ x Không lớn x ! Mọi 8/4/16 dãy số sau: a= Mô tả bước thực xếp dãy tăng dần – giảm dần BubbleSort b Minh họa thuật toán a Giới thiệu: ! QuickSort phương pháp xếp tốt ! ý tưởng: 82 ! Cho void BubbleSort(int a[ ], int n) { int i,j,tg; for( i = ; ii ; j ) if ( a[ j ] < a[ j-1] ) { tg = a[ j ]; a[ j ] = a[ j-1]; a[ j-1 ] = tg; } } Input ! 76 f Ví dụ minh họa: CTDL – Khoa CNTH – Viện ĐH Mở 83 84 Phân hoạch dãy X j i 12 15 right left 85 j j i 12 15 12 15 left Sắp xếp đoạn 86 i right STOP STOP Không nhỏ x Không lớn x left Sắp xếp đoạn 87 right i = 0, j = i = 3, j = x L 12 5 15 1 15 10 7 j L=0 R=2 L=3 R=7 Đoạn cần xếp 90 8/4/16 8/4/16 L x L x R 91 x L R 15 10 15 10 10 15 7 i j i L=5 R=7 j i L=5 R=6 j L=3 R=3 Đoạn L=0 R=2 L=3 R=3 Đoạn L=0 R=2 L=5 R=7 Đoạn cần xếp CTDL – Khoa CNTH – Viện ĐH Mở L=0 R=2 L=5 R=6 Đoạn cần xếp 92 93 8/4/16 Đoạn cần xếp 93 CTDL – Khoa CNTH – Viện ĐH Mở x i=3, j=3 94 8/4/16 94 CTDL – Khoa CNTH – Viện ĐH Mở i=0, j=2 L L x R 10 15 10 15 10 15 7 i j R Khơng cịn đoạn cần xếp! Kết thúc L=3 R=3 L=0 R=2 L=0 R=2 Đoạn cần xếp 8/4/16 L=4 R=7 i = 5, j = R L=3 R=3 95 Đoạn L=3 R=3 CTDL – Khoa CNTH – Viện ĐH Mở i = 5, j = L=4 R=7 8/4/16 91 j Đoạn Đoạn cần xếp 90 CTDL – Khoa CNTH – Viện ĐH Mở i = 4, j = 92 i L=3 R=7 L=0 R=2 Đoạn Đoạn 88 R 10 i L=0 R=7 x L R CTDL – Khoa CNTH – Viện ĐH Mở 95 Đoạn cần xếp 96 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở Đoạn cần xếp 96 97 8/4/16 CTDL – Khoa CNTH – Viện ĐH Mở 97 c Mơ tả thuật tốn ! Được d Cài đặt thuật toán: Phân hoạch toán: thực gồm hai phần: ! Bước 1: chọn tùy ý phần tử chốt x = a[k] dãy aL, a2,…,aR (k = (L+R)/2 ) i = L; j = R; ! Bước 2: phát điều chỉnh phần tử a[i] a[j] sai vị trí: – Phân hoạch tốn – Sắp xếp phân hoạch ! Định nghĩa hàm QuickSort_Asc – Input ! ! a Trong a[i]x j-c. Nếu i x ) j ; if ( i