Алгоритмы сортировки массива

Рассмотрим популярные решения для сортировки массива от медленных до быстрых.

Оглавление статьи

  1. Вводная часть
  2. Сортировка выбором
  3. Сортировка пузырьком
  4. Сортировка вставкой
  5. Сортировка шейкерная
  6. Сортировка слиянием
  7. Сортировка быстрая

Вводная часть

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

Сортировка выбором

Сортировка выбором - находит минимальный элемент в массиве и перемещает его на начало. Затем он повторяет этот процесс для оставшейся части массива.

JS
const arr = [13, 46, 52, 20, 9]

// Исходный массив: [13,46,52,20,9]
console.log('Исходный массив:', arr)

// Отсортированный массив: [9,13,20,46,52]
console.log('Отсортированный массив', selectionSort(arr))

// O(N^2)
function selectionSort(arr) {
  for (let i = 0; i <= arr.length - 2; i++) {
    for (let j = i + 1; j <= arr.length - 1; j++) {
      if (arr[i] > arr[j]) {
        const temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
      }
    }
  }

  return arr
}

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

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

JS
const arr = [13, 46, 52, 20, 9]

// Исходный массив: [13,46,52,20,9]
console.log('Исходный массив:', arr)

// Отсортированный массив: [9,13,20,46,52]
console.log('Отсортированный массив', bubbleSort(arr))

// O(N^2)
function bubbleSort(arr) {
  for(let i = 0; i < arr.length - 1; i++) {
    let swap = false

    for(let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
        swap = true
      }
    }

    if (!swap) break
  }

  return arr
}

Сортировка вставкой

Сортировка вставкой - по мере прохода по массиву элементы “вставляются” на свои места в уже отсортированной части массива.

JS
const arr = [13, 46, 52, 20, 9]

// Исходный массив: [13,46,52,20,9]
console.log('Исходный массив:', arr)

// Отсортированный массив: [9,13,20,46,52]
console.log('Отсортированный массив', insertionSort(arr))

// O(N^2)
function insertionSort(arr) {
  for(let i = 1; i < arr.length; i++) {
    let j = i

    while(j > 0 && arr[j - 1] > arr[j]) {
      const temp = arr[j - 1]
      arr[j - 1] = arr[j]
      arr[j] = temp

      j--
    }
  }

  return arr
}

Сортировка шейкерная

Шейкерная сортировка - комбинирует в себе принципы сортировки пузырьком и сортировки вставкой. Этот метод сортировки особенно полезен, когда необходимо упорядочить массив элементов, и он обладает интересной особенностью: движение “вперед-назад”.

JS
const arr = [13, 46, 52, 20, 9]

// Исходный массив: [13,46,52,20,9]
console.log('Исходный массив:', arr)

// Отсортированный массив: [9,13,20,46,52]
console.log('Отсортированный массив', cocktailSort(arr))

// O(N^2)
function cocktailSort(arr) {
  let isSorted = true;
  let begin = 0;
  let end = arr.length - 1;

  while (isSorted) {
    isSorted = false;

    // Проход слева направо
    for (let i = begin; i < end; i++) {
      if (arr[i] > arr[i + 1]) {
        [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
        isSorted = true;
      }
    }

    // Если элементы не были перемещены, то массив уже отсортирован
    if (!isSorted) {
      break;
    }

    // Сбрасываем флаг isSorted и двигаем конечный индекс на 1 назад
    isSorted = false;
    end--;

    // Проход справа налево
    for (let i = end - 1; i >= begin; i--) {
      if (arr[i] > arr[i + 1]) {
        [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
        isSorted = true;
      }
    }

    // Увеличиваем начальный индекс на 1
    begin++;
  }

  return arr;
}

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

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

JS
const arr = [13, 46, 52, 20, 9]

// Исходный массив: [13,46,52,20,9]
console.log('Исходный массив:', arr)

// Отсортированный массив: [9,13,20,46,52]
console.log('Отсортированный массив', mergeSort(arr))

// O(n log n)
function mergeSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  let mid = Math.floor(arr.length / 2);
  let left = arr.slice(0, mid);
  let right = arr.slice(mid);

  return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
  let result = [];

  let leftIndex = 0;
  let rightIndex = 0;

  while (leftIndex < left.length && rightIndex < right.length) {
    if (left[leftIndex] < right[rightIndex]) {
      result.push(left[leftIndex]);
      leftIndex++;
    } else {
      result.push(right[rightIndex]);
      rightIndex++;
    }
  }

  while (leftIndex < left.length) {
    result.push(left[leftIndex])
    leftIndex++
  }

  while (rightIndex < right.length) {
    result.push(right[rightIndex])
    rightIndex++
  }

  return result
}

Сортировка быстрая

Быстрая сортировка - это эффективный алгоритм сортировки, который основан на принципе разделения массива на подмассивы, с последующей сортировкой каждого подмассива и их объединением. Этот алгоритм известен своей высокой производительностью и широким применением в различных областях программирования.

JS
const arr = [13, 46, 52, 20, 9]

// Исходный массив: [13,46,52,20,9]
console.log('Исходный массив:', arr)

// Отсортированный массив: [9,13,20,46,52]
console.log('Отсортированный массив', quickSort(arr))

// O(n log n)
function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  let pivot = arr[0];
  let left = [];
  let right = [];

  for (let i = 1; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }

  return quickSort(left).concat(pivot, quickSort(right));
 }
Предыдущая статья Базовая концепция двумерных массивов, решения типовых задач Следующая статья Решение задачек через бинарный поиск