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

Post on 18-Jul-2020

19 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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)

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 )

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.

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)

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

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…..

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();

}

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ử

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

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ổ

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ổ

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ổ

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

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)

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();

}

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.

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ụ

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

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ụ

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ụ

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ụ

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ụ

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ụ

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ụ

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ụ

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…

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");}

}

Tham khảoTham khảo

top related