@dmitriyuvin
FullStack developer ( Laravel & Vue )

Почему не работает бинарный поиск?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main() {
	int arr[7][7] = { {-5, -2, -1, 1, 6, 7, 8},
					{-91, 6, 6, 7, 7, 8, 9},
					{-10, -1, 6, 7, 8, 9, 10},
					{-1, -1, 7, 8, 8, 8, 9},
					{-10, -8, -5, -1, -1, 7, 8},
					{-3, -2, -1, -1, 6, 7, 8},
					{1, 4, 13, 22, 31, 40, 52},
					};

	for (int i = 0; i < 7; i++) {
		for (int j = 0; j < 7;j++) {
			printf("%d", arr[i][j]);
			printf(" ");
		}
		printf("\n");
	}
	int mid = 0;
	int left = 0;
	int right = 6;
	int k = 0;
	while (left <= right) {
		mid = (left + right) / 2;
		
		if (arr[k][mid] > 5) {
			right = mid--;
		}
		else if (arr[k][mid] < 0) {
			left = mid++;
		}
		else {
			printf("Value is located at [%i]:[%i]!", k, mid);
			return 0;
		}
		k++;	
	}
	return 0;
}

Надо сделать поиск по матрице.
k - номер строки.
В чём проблема?
Ниже код на одномерный массив:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


int main() {
	int arr2[7] = { -2, -1, 0, 1, 2, 3, 4 };
	printf("This is arr2!\n=============\n");
	for (int i = 0; i < 7; i++) {
		printf(" %i |", arr2[i]);	
	}
	printf("\n=============\n");

	int left = 0;
	int right = 6;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (arr2[mid] < 0) {
			left = mid + 1;
		}
		else if (arr2[mid] > 5) {
			right = mid - 1;
		}
		else {
			printf("Needed value is with index = %i!", mid);
			return 0;
		}
	}
	return 0;
}

Мне надо найти первый элемент из диапазона (0:5)
В данном примере, оно выводит индекс еденицы = 3.
Потому что середина начинается с этого индекса и это значение попадает в диапазон.
Как это исправить?
Если задавать какое-то конкретное число, то находит правильно!
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 1
sgjurano
@sgjurano
Разработчик
if (arr2[mid] < 0) {
      left = mid + 1;
    }
    else if (arr2[mid] > 5) {
      right = mid - 1;
    }
    else {


Вы сравниваете pivot с разными значениями. Какое число вы пытаетесь найти?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы