Ví dụ hàm đệ qui: Tìm kiếm nhị phân
Trên mảng đã sắp xếp tăng dần hoặc giảm dần Trên mảng đã sắp xếp tăng dần hoặc giảm dần
Nếu giá trị cần tìm > giá trị của phần tử đầu tiên Nếu giá trị cần tìm > giá trị của phần tử đầu tiên
và nhỏ hơn giá trị của phần tử trong mảng: và nhỏ hơn giá trị của phần tử trong mảng:
So sánh phần tử giữa mảng với giá trị cần tìmSo sánh phần tử giữa mảng với giá trị cần tìm
Nếu bằng, tìm thấy và kết thúc
Nếu bằng, tìm thấy và kết thúc
Nếu
Nếu giá trị cần tìm < giá trị giữagiá trị cần tìm < giá trị giữa, tìm trong nửa trước của mảng, tìm trong nửa trước của mảng Nếu
Nếu giá trị cần tìm > giá trị giữagiá trị cần tìm > giá trị giữa, tìm trong nửa sau của mảng, tìm trong nửa sau của mảng Lặp lại cho tới khi tìm thấy hoặc đã duyệt qua hết các nửa
Lặp lại cho tới khi tìm thấy hoặc đã duyệt qua hết các nửa
Mỗi lần như vậy ta loại bỏ được một nửa số Mỗi lần như vậy ta loại bỏ được một nửa số
phần tử đang xét - tìm kiếm nhị phân phần tử đang xét - tìm kiếm nhị phân
#include <stdio.h> #include <stdio.h> #include <stdio.h> #define KT 20 #define KT 20 void main() void main() { { int ds[KT] = {1, 4, 8, 9, 18, 27, 38, 49, 55, 59, int ds[KT] = {1, 4, 8, 9, 18, 27, 38, 49, 55, 59, 67,68, 69, 72, 75, 79, 87, 88, 97, 98}; 67,68, 69, 72, 75, 79, 87, 88, 97, 98};
int cs_min, cs_max; /* Bien luu chi so cua ptu dau int cs_min, cs_max; /* Bien luu chi so cua ptu dau
va ptu cuoi trong mang */
va ptu cuoi trong mang */
int gtri_tim; // gia tri can tim kiem int gtri_tim; // gia tri can tim kiem
int cs; // chi so int cs; // chi so
scanf( “Nhap gia tri can tim: %d”, & gtri_tim);scanf( “Nhap gia tri can tim: %d”, & gtri_tim);
minindex = 0; // Chi so cua phan tu dau tienminindex = 0; // Chi so cua phan tu dau tien
while (cs_min < cs_max)
while (cs_min < cs_max)
{
{
cs = (cs_max + cs_min)/2;
cs = (cs_max + cs_min)/2;
if (ds[cs]==gtri_tim) //Neu tim thay thi dungif (ds[cs]==gtri_tim) //Neu tim thay thi dung
{ {
cs_min = cs_max; break;
cs_min = cs_max; break;
}}
if (gtri_tim > ds[cs]) // Khoang sauif (gtri_tim > ds[cs]) // Khoang sau { { cs_min = cs + 1; cs_min = cs + 1; } } else{ else{ cs_max = cs - 1; cs_max = cs - 1; } //Khoang truoc } //Khoang truoc }}
if (cs_min == cs_max){if (cs_min == cs_max){