Обработка массивов: поиск, сортировка

Линейный и бинарный поиск в массиве, сортировка обменом (пузырьковая сортировка). Трассировка алгоритмов поиска и сортировки. Решение задач ОГЭ на обработку массивов.

Обработка массивов: поиск, сортировка

Определение

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

Бинарный поиск — алгоритм поиска в отсортированном массиве, при котором диапазон поиска каждый раз делится пополам.

Сортировка обменом (пузырьковая сортировка) — алгоритм, при котором многократно проходят по массиву, сравнивая соседние элементы и меняя их местами, если они расположены в неправильном порядке.

Пример

Линейный поиск

# Линейный поиск элемента в массиве
def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # нашли — возвращаем индекс
    return -1  # не нашли

# Пример использования
a = [15, 8, 23, 4, 42, 16, 11]
x = int(input("Что ищем? "))
result = linear_search(a, x)
if result != -1:
    print(f"Элемент найден на позиции {result}")
else:
    print("Элемент не найден")

Трассировка: a = [15, 8, 23, 4, 42, 16, 11], ищем x = 23. i=0: a[0]=15 ≠ 23. i=1: a[1]=8 ≠ 23. i=2: a[2]=23 = 23 → return 2. Ответ: 2.

Бинарный поиск

# Бинарный поиск (массив должен быть отсортирован)
def binary_search(arr, target):
    left = 0
    right = len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

# Пример использования
a = [2, 5, 8, 12, 19, 24, 31, 37]
x = int(input("Что ищем? "))
result = binary_search(a, x)
if result != -1:
    print(f"Элемент найден на позиции {result}")
else:
    print("Элемент не найден")

Трассировка: a = [2, 5, 8, 12, 19, 24, 31, 37], ищем x = 24. left=0, right=7. mid=3: a[3]=12 < 24 → left=4. left=4, right=7. mid=5: a[5]=24 = 24 → return 5.

Сортировка

Пузырьковая сортировка

# Пузырьковая сортировка
def bubble_sort(arr):
    n = len(arr)
    for i in range(n - 1):
        for j in range(n - 1 - i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

# Пример использования
a = [5, 3, 8, 1, 9, 2]
print("Было:", a)
bubble_sort(a)
print("Стало:", a)

Трассировка: a = [5, 3, 8, 1, 9, 2], n=6. i=0 (j=0..4): [3,5,1,8,2,9] — 5↔3, 8↔1, 9↔2 i=1 (j=0..3): [3,1,5,2,8,9] — 5↔1, 8↔2 i=2 (j=0..2): [1,3,2,5,8,9] — 3↔1, 5↔2 i=3 (j=0..1): [1,2,3,5,8,9] — 3↔2 i=4 (j=0..0): [1,2,3,5,8,9] — без обменов Результат: [1, 2, 3, 5, 8, 9]

Школьный алгоритмический язык: линейный поиск

алг ЛинейныйПоиск (цел таб arr[1:N], цел target)
арг arr, target
рез цел
нач
  цел i
  нц для i от 1 до N
    если arr[i] = target то
      знач := i
      выход
    все
  кц
  знач := 0
кон

Школьный алгоритмический язык: пузырьковая сортировка

алг ПузырьковаяСортировка (цел таб arr[1:N])
арг arr
рез arr
нач
  цел i, j, tmp
  нц для i от 1 до N-1
    нц для j от 1 до N-i
      если arr[j] > arr[j+1] то
        tmp := arr[j]
        arr[j] := arr[j+1]
        arr[j+1] := tmp
      все
    кц
  кц
кон

Обозначения

ОперацияСинтаксисОписание
Линейный поискfor i in range(n): if arr[i] == xO(n), массив не обязательно отсортирован
Бинарный поискwhile left <= right: mid = (l+r)//2O(log n), массив отсортирован
Пузырьковая сортировкаfor i in range(n-1): for j in range(n-1-i): if arr[j] > arr[j+1]: swapO(n²)
Обмен элементовa, b = b, aМеняет значения двух переменных
Поиск максимумаmax(arr)Встроенная функция
Поиск минимумаmin(arr)Встроенная функция

Важно!

Примеры вопросов из тренажёра

  1. Q: Какой алгоритм поиска можно применить к неотсортированному массиву?

    A: верный ответ — Только линейный

    Объяснение: Линейный поиск работает на любом массиве. Бинарный требует предварительной сортировки.

  2. Q: Какова сложность бинарного поиска?

    A: верный ответ — O(log n)

    Объяснение: Бинарный поиск делит диапазон пополам на каждом шаге, поэтому сложность O(log n).

  3. Q: Что выведет программа? arr = [5, 3, 8, 1, 9] for i in range(len(arr)): if arr[i] == 8: print(i) break

    A: верный ответ — 2

    Объяснение: Линейный поиск: arr[0]=5, arr[1]=3, arr[2]=8 — найдено на индексе 2.

  4. Q: Дан отсортированный массив [2, 5, 8, 12, 19, 24, 31]. Сколько элементов будет проверено при бинарном поиске числа 19?

    A: верный ответ — 3

    Объяснение: mid=3 (12) < 19 → left=4. mid=5 (24) > 19 → right=4. mid=4 (19) = 19. Проверено 3 элемента.

  5. Q: Что делает пузырьковая сортировка за один проход (i=0)?

    A: верный ответ — Ставит максимальный элемент в конец

    Объяснение: За первый проход самый большой элемент «всплывает» в конец массива.

Пройти тему «Обработка массивов: поиск, сортировка» в приложении