Последовательный (линейный) поиск
Поиск последовательно проверяет все элементы, а так же достижение конца массива.
int line_seach(int *mArray, int _size, int find_el)
{
int position = 0;
for(;(mArray[position] != find_el) && (position < _size); position++); //Поиск
position++; //Корректируем номер позиции
return position <= _size ? position : 0; //Если элемент найден, то возвращаем его позицию, если нет, то 0
}
Двоичный поиск (только для отсортированных массивов)
Массив делится пополам и граница сдвигается в соответствии с тем, где, возможно, находится искомый элемент.
Боевой пример:
int dv_seach(int *mArray, int _size, int find_el)
{
int left = 0, right = _size - 1, m; //Устанавливаем границы
while(left < right)
{
m = (left + right) / 2; //Выбираем середину
if (find_el > mArray[m]) left = m + 1; //Если элемент в середине рассматриваемого
//участка больше искомого, то сдвигаем границу влево
else right = m; //Если меньше - вправо
}
return find_el == mArray[left] ? left + 1 : 0; //Если элемент найден, то возвращаем его позицию, если нет, то 0
}
Поиск с барьером
Алгоритм поиска заключается в установке "барьера" - искомого элемента - в конец массива.
Таким образом пропадает необходимость проверки на достижение конца массива.
Боевой пример:
int barrier_seach(int *mArray, int _size, int find_el)
{
int position = 0;
if (mArray[_size-1] != find_el) //Проверим, нет ли искомого элемента на последней позиции
{
mArray[_size-1] = find_el; //Установим "барьер"
for(;mArray[position] != find_el; position++); //Поиск
position++; //Корректируем номер позиции
}
else return _size; //Если искомый элемент на последней позиции, то возвращаем размер
return position < _size ? position : 0; //Если элемент найден, то возвращаем его позицию, если нет, то 0
}
КМП поиск (Алгоритм Кнута Морриса Пратта)
Разъяснения напишу позже.
int Find (string str, string templ)
{
int i, j, strlen, templlen;
strlen = str.length();
templlen = templ.length();
int *d = new int[templlen];
// Вычисление префикс-функции
i = 0;
j = -1;
d[0] = -1;
while (i < templlen-1)
{
while ((j >= 0) && (templ[j] != templ[i]))
j = d[j];
++i;
++j;
d[i] = (templ[i] == templ[j]) ? d[j] : j;
}
// Поиск строки
for (i = 0, j = 0; (i < = strlen-1) && (j <= templlen-1); ++i,++j)
while ((j >= 0) && (templ[j] != str[i]))
j = d[j];
delete[] d;
// Если совпадение есть - возвращаем позицию,
// если нет - -1
return (j == templlen) ? i - j : -1;
}
Вызывается:
Find(*str, *tmpl)
Где:
string* str; //строка, в которой ищем string* tmpl; //строка, которую ищем
Алгоритм Бойера-Мура-Хорспула
Сортировка:
1. Быстрая сортировка (англ. quicksort)
2. Сортировка Шелла (англ. Shell sort)
Поиск:
1. Прямой поиск (он же Простой, он же Алгоритм грубой силы)
И новенькое:
Алгоритм Бойера-Мура-Хорспула
Прямой поиск
И вновь алгоритмы. Тут уже есть:
1. Быстрая сортировка (англ. quicksort)
2. Сортировка Шелла (англ. Shell sort)
Добавим алгоритмов поиска. Итак:
Прямой поиск.