Последовательный поиск предполагает последовательный просмотр всех записей множества, организованного как массив.
Пример на Си: Найти в массиве элемент со значением, равным 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
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
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
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;
}
Результат выполнения
подскажите, пожалуйста, как в массиве найти элемент, введенный с клавиатуры, а не заданный, как в примере
например:
2
3
4
scanf_s("%d \n", &y);
point=search(mas,5,y);
//заголовок функции поиска int search(int mas, int n, int x);
почему в процессе программы выполняется ветвь с else, то есть если не найден элемент, но самое непонятное, если найден все равно выполняется ветвь с else и выводится на экран "элемент не найден" ?
Чтоб ответить, нужно видеть тело функции search
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 <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;
}
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 <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;
}