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

Алгоритмы сортировки и поиска / Последовательный поиск

 

Последовательный поиск предполагает последовательный просмотр всех записей множества, организованного как массив.
Пример на Си: Найти в массиве элемент со значением, равным 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[i] == 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[i]);
  }
  // Вызываем функцию поиска в массиве элемента, равного 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
#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[i] == key)    // если находим элемент со значением key,
    {
      if (i == 0)      // если индекс равен нулю, возвращаем его,
        return i;     // потому что смещаться ближе к началу массива невозможно
      temp = k[i];      // меняем местами найденный элемент с предыдущим
      k[i] = k[i - 1];
      k[i - 1] = 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[i]);
  }
  // Повторяем процедуру поиска 6 раз (с учетом транспозиции)
  for (int j = 0; j < 6; j++) 
  {
    point = search(k, 8, 3); // вызов функции поиска
    // Вывод индекса элемента, равного 3
    if (point == -1)
      printf("Элементов равных 3 в массиве нет!\n");
    else
      printf("Элемент с индексом %d равен 3\n", 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
#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[i] == key)    // если находим элемент со значением key,
    {
      temp = k[i];      // меняем местами найденный элемент с начальным
      k[i] = k[0];
      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[i]);
  }
  // Повторяем процедуру поиска 6 раз (с учетом транспозиции)
  for (int j = 0; j < 6; j++) 
  {
    point = search(k, 8, 3); // вызов функции поиска
    // Вывод индекса элемента, равного 3
    if (point == -1)
      printf("Элементов равных 3 в массиве нет!\n");
    else
      printf("Элемент с индексом %d равен 3\n", point);
  }
  getchar(); getchar();
  return 0;
}

Результат выполнения
Метод перемещения в начало: результат выполнения
Такой вариант поиска может быть полезен если чаще всего производится обращение к одной и той же записи таблицы.


Назад: Алгоритмы сортировки и поиска

Комментариев к записи: 5

  • Используя метод последовательного поиска, отобразите 4 (4,8,…) числа элементов массива A. помогите найти пж

  • подскажите, пожалуйста, как в массиве найти элемент, введенный с клавиатуры, а не заданный, как в примере например:
    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
        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
          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;
          }

Добавить комментарий

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