186 lines
5.9 KiB
C++
186 lines
5.9 KiB
C++
#include <iostream>
|
||
|
||
int binarySearch(int array[], int length, int element)
|
||
{
|
||
// Пример.
|
||
// Бинарный поиск элемента element в массиве чисел array.
|
||
// int array[] - массив чисел, отсортированный по возрастанию. (!!!)
|
||
// int length - длина массива.
|
||
// int element - число, которое необходимо найти в массиве.
|
||
|
||
int left = 0; // Левая граница
|
||
int right = length - 1; // Правая граница
|
||
int middle = 0; // Середина
|
||
|
||
while (left <= right)
|
||
{
|
||
middle = (left + right) / 2; // Шаг 1
|
||
if (array[middle] == element)
|
||
{
|
||
return middle;
|
||
}
|
||
|
||
if (array[middle] < element) // Шаг 2
|
||
{
|
||
left = middle + 1;
|
||
}
|
||
else
|
||
{
|
||
right = middle - 1;
|
||
}
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
|
||
|
||
// Задание 1.1
|
||
// Написать программу для бинарного поиска элемента в отсортированном
|
||
// массиве. В случае, если элемент не найден, указать позицию, в которую
|
||
// можно выполнить вставку элемента (чтобы массив оставался
|
||
// отсортированным) и выполнить вставку.
|
||
int binarySearchWithInsert(int array[], int *length, int element)
|
||
{
|
||
// Пример.
|
||
// Бинарный поиск элемента element в массиве чисел array.
|
||
// int array[] - массив чисел, отсортированный по возрастанию. (!!!)
|
||
// int length - длина массива.
|
||
// int element - число, которое необходимо найти в массиве.
|
||
|
||
int left = 0; // Левая граница
|
||
int right = *length - 1; // Правая граница
|
||
int middle = 0; // Середина
|
||
|
||
while (left <= right)
|
||
{
|
||
middle = (left + right) / 2; // Шаг 1
|
||
if (array[middle] == element)
|
||
{
|
||
return middle;
|
||
}
|
||
|
||
if (array[middle] < element) // Шаг 2
|
||
{
|
||
left = middle + 1;
|
||
}
|
||
else
|
||
{
|
||
right = middle - 1;
|
||
}
|
||
}
|
||
|
||
int insertPosition = left; // Позиция вставки
|
||
|
||
// От позиции вставки сдвигаем все элементы вправо
|
||
for (int i = *length; i > insertPosition; i--)
|
||
{
|
||
array[i] = array[i - 1];
|
||
}
|
||
|
||
array[insertPosition] = element;
|
||
*length = *length + 1;
|
||
|
||
return -1;
|
||
}
|
||
|
||
// Задание 1.2
|
||
// Массив arr называется горным, если выполняются следующие свойства:
|
||
// 1) В массиве не менее трех элементов
|
||
// 2) Существуют i (0 < i < arr.length – 1) что:
|
||
// ▪ arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
|
||
// ▪ arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
|
||
// Иными словами, в массиве есть пик (или несколько пиков) такие, что
|
||
// остальные элементы убывают влево и вправо относительно пика.
|
||
// Используя алгоритм бинарного поиска, проверить, является ли массив arr
|
||
// горным. Если да – вернуть индекс первого пика.
|
||
int isMountain(int array[], int length)
|
||
{
|
||
// Проверка на минимальную длину массива
|
||
if (length < 3)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
int left = 0;
|
||
int right = length - 1;
|
||
|
||
while (left < right)
|
||
{
|
||
int middle = left + (right - left) / 2;
|
||
|
||
// Проверка, является ли mid пиком
|
||
if (array[middle] > array[middle + 1] && array[middle] > array[middle - 1])
|
||
{
|
||
return middle;
|
||
}
|
||
|
||
if (array[middle] < array[middle + 1])
|
||
{
|
||
left = middle + 1; // Ищем в правой части
|
||
}
|
||
else
|
||
{
|
||
right = middle; // Ищем в левой части
|
||
}
|
||
}
|
||
|
||
// Если не найдено ни одного пика
|
||
return -1;
|
||
}
|
||
|
||
|
||
// 1.3
|
||
// Массив отсортирован по возрастанию (элементы могут повторяться). С
|
||
// помощью алгоритма бинарного поиска выяснить, каких чисел в массиве
|
||
// больше – положительных или отрицательных. Если больше
|
||
// положительных чисел – вывести их количество, если же больше
|
||
// отрицательных, то вывести их количество
|
||
int whichIsMore(int array[], int length)
|
||
{
|
||
int left = 0; // Левая граница
|
||
int right = length - 1; // Правая граница
|
||
int middle = 0; // Середина
|
||
|
||
// Ищем первое положительное число
|
||
while (left <= right)
|
||
{
|
||
middle = left + (right - left) / 2;
|
||
|
||
if (array[middle] > 0)
|
||
{
|
||
right = middle - 1;
|
||
}
|
||
else
|
||
{
|
||
left = middle + 1;
|
||
}
|
||
}
|
||
|
||
int positiveCount = length - left; // Количество положительных чисел
|
||
int negativeCount = left; // Количество отрицательных чисел
|
||
|
||
return positiveCount > negativeCount ? positiveCount : negativeCount;
|
||
}
|
||
|
||
// 1.4
|
||
// Дан целочисленный массив nums. Постройте целочисленный массив
|
||
// counts, где counts[i]— количество меньших элементов справа от nums[i].
|
||
int* countsFromNums(int nums[], int length)
|
||
{
|
||
int *counts = new int[length];
|
||
|
||
for (int i = 0; i < length; i++)
|
||
{
|
||
counts[i] = 0;
|
||
for (int j = i + 1; j < length; j++)
|
||
{
|
||
if (nums[i] > nums[j])
|
||
{
|
||
counts[i]++;
|
||
}
|
||
}
|
||
}
|
||
|
||
return counts;
|
||
}
|