Vấn đề tìm kiếm nhị phân

Em chào mọi người ạ, em có làm bài tìm kiếm nhị phân với 2 style là dùng đệ quy vs k dùng đệ quy, em k hiểu sao logic em cũng khá hợp lí và em có hỏi bạn thì nó bảo đúng, vậy mà lúc chạy lại sai hết cả hai
Mong mn giúp em vs ạ, e cảm ơn nhiều

Bài này e làm từ tuần trc, lúc đó debug thì OK, nhưng k hiểu sao mới cài thêm GCC thì lên chạy bật lại thì nó lại xảy ra lỗi ;(((
(Hình 1: Tìm kiếm dùng đệ quy)


(Hình 2: Không dùng đệ quy - k cho up thêm ảnh nên e mạn phép cop code sang)

int BinarySearch(int* a, int n, int key)
{
	if (!isAscending(a, n))
	{
		AscendingArr(a, n);
	}
	/*PrintArray(a, n);*/
	//bineary search not using recursion
	int left, right, middle, flag = 0;
	left = 0;
	right = n - 1;
	while (left <= right) {
		//tai sao k dung middle =(left + right)/2
		middle = (left + (right- left)) / 2;
		if (key == a[middle])
		{
			flag = 1;
			return middle;
		}
		//neu nhu key nho hon value cua a[middle], tuc la no nam ben phai
		else if (key < a[middle]) {
			right = middle - 1;
		}
		//neu nhu key lon hon value cua a[middle], tuc la no nam ben trai
		else {
			left = middle + 1;
		}
	}
	if (flag == 0)
	{
		return -1;
	}
}

Up code dưới dạng chữ thay vì hình ảnh.

3 Likes

Ưu tiên dùng chữ thay vì ảnh, vì dễ dàng cho mọi người sao chép và chạy thử.

Chép mã đầy đủ luôn!

3 Likes

công thức tính middle tầm bậy đây

còn tại sao ko dùng left + right)/2 là vì int + int có thể tràn số, ví dụ left = 1 tỷ, right = 2 tỷ cộng lại 3 tỷ tràn số, trong khi xài left + (right - left) / 2 thì ra đúng.

4 Likes

ồ em hiểu rồi ạ, em cảm ơn mn nhiều :((( , tại em sợ dạng chữ nhìn nó hơi khó đọc nên e để dạng ảnh

Để chữ thì còn copy ra text editor được mà :slight_smile: highlight bằng cách nào thì không thành vấn đề.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?