Рубрики
Без рубрики

Сортировать в JavaScript

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

Автор оригинала: Abhilash Kakumanu.

Вступление

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

Вообще проще искать элемент (называемый ключом) в данном списке, если список отсортирован как визуально, так и алгоритмически.

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

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

Понимание логики позади сортировки слияния

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

Вот шаги слияния сортировки:

  1. Разделите данный список на две половины (примерно равные половинки в случае списка с нечетным числом элементов).
  2. Продолжайте разделить помехи таким же образом, пока вы не останетесь только с одним элементом.
  3. Начиная с одного элемента массивов, слияние Подвески, так что каждая объединенная подставка отсортирована.
  4. Повторите шаг 3 единицы с помощью одного сортированного массива.

Давайте посмотрим, как работает сортировка слияния на массиве, таком как [4, 8, 7, 2, 11, 1, 3] :

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

Реализация сортировки слияния в JavaScript

Давайте сначала пишу код на Слияние () два отсортированных помех в отсортированный массив. Очень важно иметь в виду, что оба подлочках уже отсортированы, и мы просто расчесываем их, используя Слияние () функция.

Мы можем сделать это, переходя оба этих подлочках, и добавляя один на один элемент, так что полученный массив также отсортирован:

function merge(left, right) {
    let arr = []
    // Break out of loop if any one of the array gets empty
    while (left.length && right.length) {
        // Pick the smaller among the smallest element of left and right sub arrays 
        if (left[0] < right[0]) {
            arr.push(left.shift())  
        } else {
            arr.push(right.shift()) 
        }
    }
    
    // Concatenating the leftover elements
    // (in case we didn't go through the entire left or right array)
    return [ ...arr, ...left, ...right ]
}

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

При этом мы удаляем выбранный элемент из подпункта (это достигается с помощью функции Shift () ). Мы продолжаем этот процесс, пока один из подлобок не станет пустым. После этого мы нажимаем остальные элементы непустой подстройки (потому что они уже отсортированы) в основной массив.

Поскольку теперь у нас есть код, чтобы объединить две отсортированные массивы ( завоевать часть Divide-and-Proquer ), давайте напишем окончательный код для нашего алгоритма сортировки слияния. Это означает, что нам нужно сохранить расщепление массивов, пока мы не входим с массивами, которые содержат только один элемент:

function mergeSort(array) {
  const half = array.length / 2
  
  // Base case or terminating case
  if(array.length < 2){
    return array 
  }
  
  const left = array.splice(0, half)
  return merge(mergeSort(left),mergeSort(array))
}

Здесь мы идентифицируем среднюю точку и разделили массив на два подлочка, используя Сращивание () функция. Если есть нечетное количество элементов, слева получает меньшее количество элементов. Мы разделяем, пока мы не останется с одним элементом массивов ( Array.length <2 ). После этого мы начинаем объединять подлочки, используя ранее написанные Слияние () функция.

Теперь, когда у нас есть код на месте, давайте посмотрим на вывод запуска функции на нашем предыдущем примере:

array = [4, 8, 7, 2, 11, 1, 3];
console.log(mergeSort(array));

Что дает нам ожидаемый выход:

1,2,3,4,7,8,11

Эффективность сортировки слияния

Сложность наихудшего случая сорта слияния составляет O (nlogn) , так же, как и для лучшего случая времени сложности для Быстрая сортировка Отказ Когда дело доходит до скорости, сортировка слияния является одним из самых быстрых алгоритмов сортировки там.

В отличие от быстрого сорта, слияние не является на месте Алгоритм сортировки, то есть требуется дополнительное пространство, кроме входного массива. Это потому, что мы используем вспомогательные (помощники) массивы для хранения подзаготовок. Космическая сложность сортировки слияния является O (n) Отказ

Еще одно преимущество сортировки слияния состоит в том, что он очень хорошо поддается многопоточной, поскольку каждую соответствующую половину и сортироваться самостоятельно. Еще один распространенный способ уменьшения времени выполнения сортировки слияния состоит в том, чтобы остановиться, когда мы добираемся до относительно небольших помех (~ 7) и с использованием вставки, чтобы сортировать их.

Это сделано, поскольку вставной сорт выполняет действительно хорошо на небольших или почти отсортированных массивах. Намного лучше, чем все глобально эффективные аналоги.

Заключение

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