Sobes.tech
Назад к вопросам
Middle — Senior
12

Как реализовать слияние двух отсортированных массивов в один отсортированный?

Компании, где спрашивали
ПлатформаОФД
AvitoAvito

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно объяснить классический алгоритм merge: пройти по двум массивам двумя указателями и на каждом шаге брать меньший текущий элемент. Это даёт линейную сложность по сумме длин массивов и не требует дополнительной сортировки. Важно отдельно упомянуть обработку хвоста того массива, который не закончился.

Определение:

Слияние двух отсортированных массивов — это операция, при которой из двух уже упорядоченных последовательностей строится одна тоже упорядоченная последовательность. Обычно используется два индекса: по одному на каждый массив. На каждом шаге сравниваются текущие элементы, меньший переносится в результат, и соответствующий индекс сдвигается.

Пример использования:

Допустим, есть два отсортированных массива:

a := []int{1, 3, 5, 8}
b := []int{2, 4, 6, 7, 9}

Результат слияния:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Пример реализации на Go:

package main

import "fmt"

func mergeSorted(a, b []int) []int {
	result := make([]int, 0, len(a)+len(b))

	i, j := 0, 0
	for i < len(a) && j < len(b) {
		if a[i] <= b[j] {
			result = append(result, a[i])
			i++
		} else {
			result = append(result, b[j])
			j++
		}
	}

	result = append(result, a[i:]...)
	result = append(result, b[j:]...)

	return result
}

func main() {
	a := []int{1, 3, 5, 8}
	b := []int{2, 4, 6, 7, 9}

	fmt.Println(mergeSorted(a, b))
}

Пояснение кода:

Код не требуется, но пример разберём по шагам.

  1. Создаётся результирующий слайс с ёмкостью len(a)+len(b), чтобы не делать лишних перераспределений памяти.
  2. Два указателя i и j стартуют с нулевых позиций в a и b.
  3. Пока оба массива не закончились, сравниваются a[i] и b[j].
  4. Меньший элемент добавляется в result, после чего соответствующий индекс увеличивается.
  5. Когда один массив заканчивается, оставшиеся элементы второго массива уже гарантированно идут в правильном порядке, поэтому они просто дописываются в конец результата.
  6. В конце получается один отсортированный массив без дополнительной сортировки.

Ключевые моменты:

  • Алгоритм работает за O(n + m), где n и m — длины массивов.
  • Дополнительная память обычно O(n + m) для результата.
  • Если нужны дубликаты, они сохраняются как есть; если нужен merge без повторов, это отдельная логика.
  • Для стабильности при равных значениях обычно берут элемент из первого массива первым.
  • Метод подходит только для уже отсортированных входных данных.