Последовательный поиск

Последовательный поиск

Последовательный поиск предполагает последовательный просмотр всех записей множества, организованного как массив.

Пример на Си: Найти в массиве элемент со значением, равным 3.

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
#define _CRT_SECURE_NO_WARNINGS // для корректной работы scanf в Visual Studio последних версий
#include <stdio.h>
#include <stdlib.h> // для переключения на русский язык - функция system()
// Функция поиска в массиве k размерности n
// элемента со значением key
int search(int* k, int n, int key)
{
  for (int i = 0; i < n; i++) // просматриваем все элементы в цикле
  {
    if (k == key)      // если находим элемент со значением key,
    return i;     // возвращаем его индекс
  }
  return -1;  // возвращаем -1 - элемент не найден
}
int main()
{
  int k[8];    // описываем массив из 8 элементов
  int point;    // индекс элемента, равного указанному значению (3)
  system("chcp 1251"); // переходим на страницу 1251 для поддержки русского языка
  system("cls");       // очищаем окно консоли
  // В цикле вводим элементы массива
  for (int i = 0; i < 8; i++)
  {
    printf("Введите k[%d]: ", i);
    scanf("%d", &k);
  }
  // Вызываем функцию поиска в массиве элемента, равного 3
  point = search(k, 8, 3);
  if (point == -1) // если функция вернула -1, такого элемента в массиве нет
    printf("Элементов равных 3 в массиве нет!\n");
  else // иначе выводим полученный индекс элемента
    printf("Элемент с индексом %d равен 3", point);
  getchar(); getchar();
  return 0;
}

Результат выполнения

Последовательный поиск

Метод транспозиции

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

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
43
44
45
46
47
48
49
50
51
52
#define _CRT_SECURE_NO_WARNINGS // для корректной работы scanf()
#include <stdio.h>
#include <stdlib.h>    // для переключения на русский язык - функция system()
// Функция поиска в массиве k размерности n
// элемента со значением key с использованием транспозиции
int search(int* k, int n, int key)
{
  int temp;          // вспомогательная переменная для обмена
  for (int i = 0; i < n; i++) // просматриваем все элементы в цикле
  {
    if (k == key)    // если находим элемент со значением key,
    {
      if (i == 0)      // если индекс равен нулю, возвращаем его,
        return i;     // потому что смещаться ближе к началу массива невозможно
      temp = k;      // меняем местами найденный элемент с предыдущим
      k = k;
      k = temp;
      return i;         // возвращаем найденный индекс элемента
    }
  }
  return -1;  // если элемент не найден, возвращаем -1
}
int main()
{
  int k[8];    // описываем массив из 8 элементов
  int point;    // индекс элемента, равного указанному значению (3)
  system("chcp 1251"); // переходим на страницу 1251 для поддержки русского языка
  system("cls");       // очищаем окно консоли
  // В цикле вводим элементы массива
  for (int i = 0; i < 8; i++)
  {
    printf("Введите k[%d]: ", i);
    scanf("%d", &k);
  }
  // Повторяем процедуру поиска 6 раз (с учетом транспозиции)
  for (int j = 0; j < 6; j++)
  {
    for (int i = 0; i < 8; i++)
    {
      printf("%d ", k);
    }
    printf("\n");
    point = search(k, 8, 3); // вызов функции поиска
    // Вывод индекса элемента, равного 3
    if (point == -1)
      printf("Элементов равных 3 в массиве нет!\n");
    else
      printf("Элемент с индексом %d равен 3\n", point);
  }
  getchar(); getchar();
  return 0;
}

Результат выполнения

Метод перемещения в начало

В этом методе каждый запрос к записи сопровождается её перемещением в начало таблицы. Остальные записи смещаются вниз на 1 позицию.

В итоге в начале таблицы оказывается запись, используемая в последний раз.

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
43
44
45
46
47
48
49
50
51
52
#define _CRT_SECURE_NO_WARNINGS // для корректной работы scanf()
#include <stdio.h>
#include <stdlib.h>  // для переключения на русский язык - функция system()
// Функция поиска в массиве k размерности n
// элемента со значением key с использованием транспозиции
int search(int* k, int n, int key)
{
  int temp;     // вспомогательная переменная для обмена
  for (int i = 0; i < n; i++) // просматриваем все элементы в цикле
  {
    if (k == key)  // если находим элемент со значением key,
    {
      temp = k;   // меняем местами найденный элемент с начальным
      for (int j = i; j > 0; j--)
        k[j] = k[j - 1];
      k[0] = temp;
      return i;     // возвращаем найденный индекс элемента
    }
  }
  return -1; // если элемент не найден, возвращаем -1
}

int main()
{
  int k[8];  // описываем массив из 8 элементов
  int point;  // индекс элемента, равного указанному значению (3)
  system("chcp 1251"); // переходим на страницу 1251 для поддержки русского языка
  system("cls");    // очищаем окно консоли
  // В цикле вводим элементы массива
  for (int i = 0; i < 8; i++)
  {
    printf("Введите k[%d]: ", i);
    scanf("%d", &k);
  }
  // Повторяем процедуру поиска 6 раз (с учетом транспозиции)
  for (int j = 0; j < 3; j++)
  {
    for (int i = 0; i < 8; i++)
    {
      printf("%d ", k);
    }
    printf("\n");
    point = search(k, 8, 3); // вызов функции поиска
    // Вывод индекса элемента, равного 3
    if (point == -1)
      printf("Элементов равных 3 в массиве нет!\n");
    else
      printf("Элемент с индексом %d равен 3\n", point);
  }
  getchar(); getchar();
  return 0;
}

Результат выполнения

Прокрутить вверх