Поиск ближайшего значения int в отсортированном массиве <= заданное значение справа - PullRequest
0 голосов
/ 05 сентября 2018

Как изменить программу так, чтобы она возвращала значение = 8 index 8, то есть первый индекс «8» справа (а не index 6 теперь, т.е. первый индекс «8» слева). Для значения = 7 программа корректно возвращает индекс 5 (значение массива 6).

#include "pch.h"
#include <iostream>

int arr[10]{0, 2, 3, 5, 5, 6, 8, 8, 8, 9};
int arr_size = sizeof(arr) / sizeof(arr[0]);


int main()
{
for (int i = 0; i <= arr_size; i++)
{
    printf("%i\n", arr[i]);
}
printf("\n");

int left = 0;
int right = arr_size - 1;
int middle = 0; 
int value = 8 ; 
int x = 0;
int index = 0;



//* Searching for value in ascending sorted array
while (left <= right) {
    middle = (left + right) / 2;
    if (arr[middle] <= value) {
        x = arr[middle];
        index = middle;
    }
    if (value > arr[middle]) {
        left = middle + 1;
    }
    else {
        right = middle - 1;
    }
}
printf("Found %i at position %i\n", x, index);

}

1 Ответ

0 голосов
/ 05 сентября 2018

Просто используйте std::upper_bound():

int arr[] = {0, 2, 3, 5, 5, 6, 8, 8, 8, 9};
auto beg = std::begin(arr);
auto it = std::upper_bound( beg, std::end(arr), 8 );
if( it == beg ) {
    std::cout << "no value less than 8 found" << std::endl;
    return 0;
}
std::cout << "index is " << std::distance( beg, it ) - 1 << std::endl;

живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...