Алгоритм сортировки слиянием: объяснение в JavaScript

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

В этой статье я расскажу о концепции, лежащей в основе этого алгоритма, и покажу вам пример на JavaScript.

Объясняя концепцию

Алгоритм «разделяй и властвуй» рекурсивно разбивает проблему на более мелкие, пока они не станут достаточно простыми для решения. Затем решения подзадач объединяются, чтобы дать решение исходной проблемы.

Идея алгоритма сортировки состоит в том, что легче отсортировать два отсортированных массива, чем один несортированный. Когда у вас есть два отсортированных массива, вы можете объединить их в один массив, сравнивая их элементы один за другим и добавляя сначала меньший элемент.

Концепцию довольно легко понять, но все же остается один вопрос. Как достичь состояния, в котором у нас есть два отсортированных массива? Что ж, мы можем добиться этого с помощью Divide and Conquer. Мы собираемся рекурсивно разделить массив пополам. Мы делаем это, пока не достигнем точки, в которой мы сравниваем несколько пар массивов с одним элементом.

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

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

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

const mergeSort = (arr) => {
  if (arr.length <= 1) {
    return arr;
  }
  const middle = Math.floor(arr.length / 2);
  return mergeArray(
    mergeSort(arr.slice(0, middle)), 
    mergeSort(arr.slice(middle))
  );
};
const mergeArray = (left, right) => {
  let result = [];
  while (left.length && right.length) {
    if (left[0] < right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
return [...result, ...left, ...right];
};
const unorderedArray = [1, 9, 3, 8, 6, 5, 7, 4, 2];
console.log(mergeSort(unorderedArray)); // Returns ordered array

Как видно из кода, реализация алгоритма сортировки слиянием довольно проста. Как только вы поймете концепцию, ее относительно легко реализовать на любом языке.

Ну вот и все. Дайте мне знать, что вы думаете. Удачного кодирования!

Больше контента на plainenglish.io

Suggested posts

Поиск информации о доменных именах

Отрывок из книги «Маленькие программные инструменты Sharp» Брайана П. Хогана.

Поиск информации о доменных именах

Когда вы делаете запрос на facebook.com, ваш компьютер ищет доменное имя, чтобы преобразовать это доменное имя в IP-адрес, чтобы ваш компьютер мог установить это соединение.

Как я перешел с математики на CS

Как я перешел с математики на CS

Процесс приема осенью 2023 года подходит к концу, и происходят отсрочки/отказы. Поздравляем, если вас приняли в программу вашей мечты в UW.

Related posts

Что вы можете сделать в свой сезон ожидания (в ожидании вашей первой работы в сфере технологий)

Что вы можете сделать в свой сезон ожидания (в ожидании вашей первой работы в сфере технологий)

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

Убийство Джордана Нили и проблема «патриотического» расизма

Могут ли США сделать важный шаг и не приравнивать расистское поведение к тому, чтобы быть хорошим американцем?

Убийство Джордана Нили и проблема «патриотического» расизма

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

Как спасти планету и заработать деньги

Как спасти планету и заработать деньги

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

Архив этой угрозы: Том 7 Черный Баста

Архив этой угрозы: Том 7 Черный Баста

В современном взаимосвязанном мире угроза кибератак более распространена, чем когда-либо. Киберпреступники и государственные деятели постоянно стремятся использовать уязвимости и украсть ценные данные, подвергая организации любого размера значительному риску.