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