tìm kiếm và sắp xếp - vnuuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfsắp...

29
Tìm kiếm và sắp xếp Tìm kiếm và sắp xếp TS. Bùi Ngọc Thăng BM KHMT- Khoa CNTT

Upload: others

Post on 18-Jul-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm và sắp xếpTìm kiếm và sắp xếp

TS. Bùi Ngọc ThăngBM KHMT- Khoa CNTT

Page 2: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Nội dung chínhNội dung chính

Giải thích sự cần thiết việc tìm kiếm và sắp xếp

Thảo luận về các thuật toán sắp xếp cơ bản:Sắp xếp nổi bọt (Bubble Sort)Sắp xếp chọn (Selection Sort)

Thảo luận về các thuật toán tìm kiếm:Tìm kiếm tuyến tính (Linear Search)Tìm kiếm nhị phân (Binary Search)

Page 3: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Sắp xếpSắp xếp

Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một thứ tự nào đó chẳng hạn như tăng dần hoặc giảm dần.

Dữ liệu trong mảng dễ dàng tìm kiếm khi được sắp xếp.

Có hai cách thức dùng sắp xếp mảng Sắp xếp lựa chọn (Selection Sort) và Sắp xếp nổi bọt (Bubble Sort )

Page 4: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Sắp xếp (tiếp)Sắp xếp (tiếp)

Trong cách sắp xếp lựa chọn: giá trị của phần tử hiện tại được so sánh với các phần tử tiếp theo trong mảng để thu được giá trị lớn/nhỏ nhất.

Có 2 phương pháp trong sắp xếp nổi bọt được triển khai: Từ dưới lên (Bottom-up): So sánh các giá trị lần

lượt từ cuối mảng nếu nhỏ hơn thì dẫn dần cho lên trên

Từ trên xuống: So sánh bắt đầu từ phần tử trên cùng, nếu phần tử lớn hơn sẽ bị chìm xuống dưới.

Page 5: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Sắp xếp nổi bọt Sắp xếp nổi bọt

Ý tưởng: So sánh hai phần tử kề nhau, nếu chúng chưa

đứng đúng thứ tự thì đổi chỗ (swap). Có thể tiến hành từ trên xuống (bên trái sang)

hoặc từ dưới lên (bên phải sang)

Page 6: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Sắp xếp nổi bọtSắp xếp nổi bọt

148 22221717814148

17

1481266

142214

12

2217178 2214814228 8222261212 6126

Cho một mảng có n phần tử Lặp lại các bước sau n-1 lần:

Với a[i] và a[i+1]:Nếu a[i] lớn hơn a[i+1] thì đổi vị trí cho nhau.

6 12 17

Page 7: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Sắp xếp nổi bọtSắp xếp nổi bọt#include <stdio.h>void main() {int i,j,temp,arr[5]={23,90,9,25,16};

for (int i=0; i<4; i++) { for (int j=0; j<5-i-1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } Tiếp…..

Page 8: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Sắp xếp nổi bọt ( tiếp)Sắp xếp nổi bọt ( tiếp)

printf("\nThe sorted array");for(i=0;i<5;i++)

printf("\n%d", arr[i]); getch();

}

Page 9: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Mảng – Sắp xếp chọn (Selection sort)

• Ý tưởng:– Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa

phần tử này về vị trí đúng là đầu tiên của dãy hiện hành.

– Sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2.

– Lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử

Page 10: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Mảng – Sắp xếp đổi chổ

2 8 5 1 6 4 1512

2 3 4 5 6 7 81

i

j

12

Page 11: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

12 8 5 2 6 4 151

2 3 4 5 6 7 81

i

j

2

Mảng – Sắp xếp đổi chổ

Page 12: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

2 12 8 5 6 4 151

2 3 4 5 6 7 81

i

j

4

Mảng – Sắp xếp đổi chổ

Page 13: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

2 4 12 8 6 5 151

2 3 4 5 6 7 81

i

j

5

Mảng – Sắp xếp đổi chổ

Page 14: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếmTìm kiếm

Trong bài học này, chúng ta sẽ thảo luận hai cách tìm kiếm:Tìm kiếm tuyến tính

Tìm kiếm nhị phân

Page 15: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm tuyến tínhTìm kiếm tuyến tính

Đây là cách đơn giản nhất để tìm kiếm một phần tử trong mảng, bằng cách duyệt tất cả các phần tử của mảng cho tới khi tìm thấy phần tử cần tìm.

Còn được gọi là tìm kiếm tuần tự (Sequential searching)

Page 16: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm tuyến tínhTìm kiếm tuyến tính

#include <stdio.h>#include <conio.h>void main(){

int data[] = {5,2,9,7,6,10};int a = 7;int i;for(i = 0; i<6;i++){

if(a == data[i])break;

}printf(“Number %d found at position %d”,a,i);getch();

}

Page 17: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm nhị phânTìm kiếm nhị phân

Tìm kiếm nhị phân được thực hiện trên mảng đã được sắp xếp

Thuật toán này sử dụng đệ quy để thực hiện tìm kiếm:Bước 1: So sánh phần tử tìm kiếm với phần tử ở vị

trí giữa mảng. Nếu kết quả so sánh là bằng nhau, kết thúc tìm kiếm.

Bước 2: Nếu kết quả so sánh là nhỏ hơn thì lặp lại bước 1 với phần bên trái của mảng.

Bước 3: Nếu kết quả so sánh là lớn hơn lặp lại bước 1 với phần bên phải của mảng.

Page 18: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lo

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

hi

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 19: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lo himid

Page 20: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lo hi

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 21: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lo mid hi

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 22: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lo hi

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 23: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lo himid

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 24: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lohi

Tìm kiếm nhị phân – ví dụTìm kiếm nhị phân – ví dụ

Page 25: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lohimid

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 26: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Ví dụ: Tìm số 33 trong mảng được sắp xếp dưới đây:

821 3 4 65 7 109 11 12 14130

641413 25 33 5143 53 8472 93 95 97966

lohimid

Tìm kiếm nhị phân – Ví dụTìm kiếm nhị phân – Ví dụ

Page 27: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm nhị phânTìm kiếm nhị phân

#include <stdio.h> #include <conio.h>

void main( ) {int data[] = {0,11,13,14,15,17,18};int low =0;int high = 6;int searchValue = 15;int flag =0;

Continue…

Page 28: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tìm kiếm nhị phân Tìm kiếm nhị phân while(low<=high)

{int mid = (high + low)/2;if(searchValue == data[mid]){

flag = 1;printf(" Element found at index %d\n", mid);break;

} else if(searchValue<data[mid]){high = mid -1;

}else if (searchValue > data[mid]){low = mid +1;

}}if(flag ==0){

printf("Element not found in the array");}

}

Page 29: Tìm kiếm và sắp xếp - VNUuet.vnu.edu.vn/~tqlong/2016thcs4/slide6_array_algorithms.pdfSắp xếp Sắp xếp dữ liệu liên quan đến việc sắp xếp mảng theo một

Tham khảoTham khảo