Какие алгоритмы поиска и сортировки вы знаете? Какие исользуете в работе?ios-7

Основные алгоритмы поиска

1. Линейный поиск )

func linearSearch<T: Equatable>(_ array: [T], _ target: T) -> Int? {
    for (index, element) in array.enumerated() {
        if element == target {
            return index
        }
    }
    return nil
}

Когда использую:

  • Для небольших массивов (<50 элементов)
  • Когда массив не отсортирован
  • В прототипах и временных решениях

2. Бинарный поиск )

func binarySearch<T: Comparable>(_ array: [T], _ target: T) -> Int? {
    var low = 0
    var high = array.count - 1

    while low <= high {
        let mid = (low + high) / 2
        if array[mid] == target {
            return mid
        } else if array[mid] < target {
            low = mid + 1
        } else {
            high = mid - 1
        }
    }
    return nil
}

Когда использую:

  • Для больших отсортированных массивов
  • В поиске по CoreData с сортировкой
  • При работе с алгоритмами "разделяй и властвуй"

3. Поиск в хэш-таблицах в среднем)

let dictionary = ["Alice": 25, "Bob": 30]
let age = dictionary["Alice"]  // O(1) поиск

Когда использую:

  • Для быстрого доступа по ключу
  • В кэшировании данных
  • При частых проверках наличия элемента

Основные алгоритмы сортировки

1. Сортировка пузырьком )

func bubbleSort<T: Comparable>(_ array: [T]) -> [T] {
    var result = array
    for i in 0..<result.count {
        for j in 1..<result.count - i {
            if result[j] < result[j-1] {
                result.swapAt(j, j-1)
            }
        }
    }
    return result
}

Когда использую:

  • Практически никогда в production
  • Только для образовательных целей

2. Быстрая сортировка в среднем)

func quickSort<T: Comparable>(_ array: [T]) -> [T] {
    guard array.count > 1 else { return array }
    let pivot = array[array.count/2]
    let less = array.filter { $0 < pivot }
    let equal = array.filter { $0 == pivot }
    let greater = array.filter { $0 > pivot }
    return quickSort(less) + equal + quickSort(greater)
}

Когда использую:

  • В пользовательских сортировках сложных объектов
  • Когда нужна сортировка на месте (in-place варианты)
  • В алгоритмических задачах

3. Сортировка слиянием )

func mergeSort<T: Comparable>(_ array: [T]) -> [T] {
    guard array.count > 1 else { return array }
    let middle = array.count / 2
    let left = mergeSort(Array(array[0..<middle]))
    let right = mergeSort(Array(array[middle..<array.count]))
    return merge(left, right)
}

private func merge<T: Comparable>(_ left: [T], _ right: [T]) -> [T] {
    var result: [T] = []
    var leftIndex = 0
    var rightIndex = 0

    while leftIndex < left.count && rightIndex < right.count {
        if left[leftIndex] < right[rightIndex] {
            result.append(left[leftIndex])
            leftIndex += 1
        } else {
            result.append(right[rightIndex])
            rightIndex += 1
        }
    }

    result += left[leftIndex..<left.count]
    result += right[rightIndex..<right.count]
    return result
}

Когда использую:

  • Для стабильной сортировки (сохранение порядка равных элементов)
  • При работе с связанными списками
  • В параллельных сортировках

Что реально используется в iOS разработке

1. Встроенные методы Swift

let sortedArray = array.sorted()  // Гибридный алгоритм (Introsort)
let index = array.firstIndex(of: element)  // Оптимизированный поиск

Преимущества:

  • Оптимизированы под архитектуру Apple
  • Поддерживают все стандартные типы
  • Читаемый код

2. Core Data и SQLite

let request: NSFetchRequest<User> = User.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

Особенности:

  • Использует оптимизированные алгоритмы базы данных
  • Работает с большими объемами данных
  • Сортировка на уровне SQL

3. Алгоритмы для специфических задач

Поиск по строке:

// Поиск подстроки (алгоритм Бойера-Мура)
if string.contains("search term") { ... }

Сортировка UI элементов:

// Сортировка перед отображением в UITableView
displayData = sourceData.sorted { $0.date > $1.date }

Критерии выбора алгоритма

  1. Размер данных:

    • До 100 элементов: почти любой алгоритм
    • 100-10,000: O(n log n)
    • 10,000: учитываем константные факторы

  2. Характеристики данных:

    • Уже частично отсортированы? → Insertion sort
    • Есть дубликаты? → Стабильные алгоритмы
    • Ограниченный диапазон значений? → Counting sort
  3. Ограничения:

    • Память: некоторые алгоритмы требуют O(n) доп. памяти
    • Время: real-time требования

Оптимизации в реальных проектах

  1. Кэширование результатов сортировки
  2. Ленивая сортировка (только при необходимости)
  3. Использование индексов (для поиска в CoreData)
  4. Предварительная сортировка на бэкенде

Резюмируем

В iOS разработке чаще всего используются:

  1. Встроенные методы Swift (sorted(), firstIndex(of:)) — в 90% случаев
  2. Оптимизированные запросы CoreData — для работы с базами данных
  3. Бинарный поиск — для больших отсортированных коллекций
  4. Хэш-таблицы (Dictionary) — для быстрого доступа по ключу

Сложные алгоритмы вручную пишутся только для:

  • Специфических требований к сортировке
  • Очень больших объемов данных
  • Алгоритмически сложных задач

Правильный подход: начинать с простых встроенных решений и оптимизировать только при доказанной необходимости.