Разновидностью линейного поиска является поиск с барьером, который заключается в том, что в конец исследуемого массива добавляется искомый элемент.Выигрыша в сложности алгоритма этот метод не дает, она также составляет O(N). Он позволяет избавиться от условия проверки достижения искомого элемента в цикле.
Однако недостаток метода заключается в необходимости увеличивать пазмер массива на один элемент. Это можно сделать в большинстве случаев только путем создания нового массива увеличенной на единицу размерности и копирования элементов из старого с последующим добавлением искомого элемента.
Далее приводится реализация алгоритма на разных языках программирования.
#include <stdio.h>
#include <stdlib.h>
int barrier_search(const int ar[], int length, int item)
{
int i = 0;
int* resized_arr = malloc(sizeof(int) * (length + 1));
for (int j = 0; j < length; j++)
resized_arr[j] = ar[j];
resized_arr[length] = item;
int new_length = length+1;
while (resized_arr[i] != item)
i++;
free(resized_arr);
if (i < new_length-1)
return i;
return -1;
}
int main(void)
{
const int arr[] = {1,2,3,4,5};
int item = 1;
int length = sizeof(arr) / sizeof(*arr);
int found = barrier_search(arr, length, item);
printf("item = %d, index = %d\n", item, found);
return 0;
}
internal class Program
{
static int BarrierSearch(T[] arr, T item) where T : IComparable
{
int length = arr.Length;
Array.Resize(ref arr, ++length);
arr[length - 1] = item;
int i = 0;
while (arr[i].CompareTo(item) != 0)
{
i++;
}
if (i < length - 1)
{
return i;
}
return -1;
}
static void Main(string[] args)
{
int[] arr = { 5, 12, 3, 8, 4, 7 };
int item = 8;
int index = BarrierSearch(arr, item);
Console.WriteLine($"Array: {string.Join(" ", arr1)}\nitem = {item}, index = {index}");
Console.ReadKey();
}
}
<?php
function BarrierSearch(array $arr, int $item) : int
{
$arr[count($arr)]=$item;
$i=0;
$length=count($arr);
while($arr[$i]!=$item) {
$i++;
}
if ($i<$length-1) {
return $i;
}
return -1;
}
function BarrierSearch(arr, item) {
if (Array.isArray(arr)) {
arr[arr.length]=item;
let i=0;
const len=arr.length;
while(arr[i]!==item) {
i++;
}
if (i<len-1) {
return i;
}
return -1;
}
else {
throw new Error("First argument must be of type Array");
}
}