Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 21.06.2016
Сообщений: 11

Поиск элемента, меньшего заданного, в упорядоченном массиве

30.06.2016, 11:52. Показов 4945. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Мне необходимо найти в массиве первый элемент, который меньше заданного, и, очень желательно, за логарифм. Массив упорядочен по убыванию. Решил приспособить для этой задачи бинарный поиск. Пробовал несколько вариантов, но у меня в каждом случае поиск выполняется либо в одной, либо в другой половине массива. Подскажите пожалуйста, как можно реализовать это. Ниже выкладываю примерный код, который у меня получился

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#define ARRSIZE 10
 
using namespace std;
 
int search(int* a, int size, int key) {
 
    int left = 0;
    int right = size-1;
    int lastPos = -1;
    if(a[left] < key) { return 0; }
    if(a[right] > key) { return -1; }
 
    while(left < right) {
        int mid = left + (right-left)/2;
        if(a[mid]==key) { return mid; }
        else if(a[mid] < key) {
            right = mid - 1;
            lastPos = mid;
        } else {
            left = mid;
            right = lastPos;
        }
    }
 
    return lastPos;
}
 
int main(void) {
    int arr[ARRSIZE] = {90, 80, 70, 60, 50, 40, 30, 20, 10, 0};
 
    int pos = search(arr, ARRSIZE, 85);
    if(pos != -1) 
        cout << arr[pos];
    else 
        cout << "Not found";
 
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2016, 11:52
Ответы с готовыми решениями:

Поиск заданного элемента в упорядоченном по возрастанию массиве целых чисел
Осуществить поиск заданного элемента в упорядоченном по возрастанию (по убыванию) массиве целых чисел.

Рекурсивный поиск заданного элемента в массиве
X - массив, состоящий из 100 числовых элементов. Написать программу, которая выдает номер первого из элементов массива X, совпадающих с...

Реализовать бинарный поиск заданного элемента в массиве
Доброго времени суток, форумчане! Реализую алгоритмы поиска: линейный и бинарный. Нужно, чтоб они выводили как одно вхождение заданного...

4
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
30.06.2016, 12:10
Уалил
1
1 / 1 / 0
Регистрация: 21.06.2016
Сообщений: 11
30.06.2016, 12:16  [ТС]
Благодарю за ответ, но мне нужно не просто бинарным поиском найти элемент, а найти ближайший к нему по значению, который меньше или равен данному
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
30.06.2016, 13:10
Лучший ответ Сообщение было отмечено RoneDePuh как решение

Решение

RoneDePuh, да, понимаю, я невнимательно прочитал задание, сори

Добавлено через 49 минут
RoneDePuh, может, так. Я, правда, не силен в этих штуках.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#define ARRSIZE 10
 
using namespace std;
 
size_t search(int* a, int size, int key) {
 
    size_t high = 0;
    size_t low = size - 1;
    size_t mid = (low + high) / 2;
    
    if (a[high] < key) return high;
    if (a[high] == key) return high + 1;
    if (a[low] >= key) return -1;
 
    while (mid != high && mid != low)
    {
        if (low == high) return low == 0 ? low + 1 : low;
 
        mid = (low + high) / 2;
 
        if (a[mid] >= key)
            high = mid + 1;
        else 
            low = mid - 1;
    }
 
    return mid;
}
 
int main(void) {
    int arr[ARRSIZE] = { 90, 80, 70, 60, 50, 40, 30, 20, 10, 0 };
 
    size_t pos = search(arr, ARRSIZE, 12);
    if (pos != -1)
        cout << arr[pos] << std::endl;
    else
        cout << "Not found" << std::endl;
 
    std::cin.get();
    return 0;
}
Добавлено через 2 минуты
RoneDePuh, этот код очень привязан к массиву, который упорядочен по убыванию.
1
1 / 1 / 0
Регистрация: 21.06.2016
Сообщений: 11
30.06.2016, 13:57  [ТС]
Спасибо огромное. Ошибка небольшая была. При входном значении 25, возвращался индекс 30, но я исправил это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2016, 13:57
Помогаю со студенческими работами здесь

Реализовать бинарный поиск заданного элемента в массиве
Помогите, напишите бинарный поиск элемента в массиве (особенно чтобы он работал, когда все элементы одинаковые)

Бинарный поиск в упорядоченном массиве
Задали реализовать бинарный поиск в упорядоченном массиве.Уже пол дня творю,3 листа исписал и ничего не получается. Вот пример поиска...

Двоичный поиск в упорядоченном массиве
Дан упорядоченный по неубыванию целочисленный массив и набор чисел ki. Требуется для каждого числа ki найти позиции первого и последнего...

Функция, выполняющая поиск заданного элемента в одномерном массиве типа double
Написать функцию, выполняющую поиск заданного элемента в одномерном массиве типа double. Параметры функции: имя массива передается по...

В отсортированном одномерном массиве выполнить поиск заданного элемента последовательным методом
Знаю,что тут есть похожая очень тема, но не могу справиться который день...так что прошу помощи:wall: В отсортированном одномерном массиве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru