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

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

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

Пример на Си: Найти в массиве элемент со значением, равным 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;
}

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

4 комментария к “Последовательный поиск”

  1. Мария

    подскажите, пожалуйста, как в массиве найти элемент, введенный с клавиатуры, а не заданный, как в примере
    например:

    1
    2
    3
    4
    int point,y;
    scanf_s("%d \n", &y);
    point=search(mas,5,y);
    //заголовок функции поиска int search(int mas, int n, int x);

    почему в процессе программы выполняется ветвь с else, то есть если не найден элемент, но самое непонятное, если найден все равно выполняется ветвь с else и выводится на экран "элемент не найден" ?

      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
        #include <stdio.h>
        #include <stdlib.h>
        int search(int* mas, int n, int x)
        {
          for (int i = 0; i < n; i++)
          {
            if (mas[i] == x)
              return 1;
          }
          return -1; // функция возвращает -1,если элемент не найден
        }
        int main() {
          system("chcp 1251");
          int mas[5] = { 0 };
          printf("введите элементы массива \n");
          for (int i = 0; i <5; i++)
            scanf_s("%d \n", &mas[i]);
          int point;
          
          point = search(mas, 5, 2);
          if (point == -1)
            printf("элемент не найден");
          else 
          printf("искомый элемнт  найден", 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
          #include <stdio.h>
          #include <stdlib.h>
          int search(int* mas, int n, int x)
          {
            for (int i = 0; i < n; i++)
            {
              if (mas[i] == x)
                return 1;
            }
            return -1; // функция возвращает -1,если элемент не найден
          }
          int main() {
            system("chcp 1251");
            int mas[5] = { 0 };
            printf("введите элементы массива \n");
            for (int i = 0; i <5; i++)
              scanf_s("%d \n", &mas[i]);
            int point, y;
            printf("Введите искомый элемент: ");
            scanf_s("%d", &y);
            point = search(mas, 5, y);
            if (point == -1)
              printf("элемент не найден");
            else 
            printf("искомый элемнт  найден", point);
            getchar();
            getchar();
            return 0;
          }

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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