Если вы когда-либо проходили курс программирования, даже для начинающих, или если вы когда-либо пытались запрограммировать что-то более сложное, чем простая программа «Hello World», вам, скорее всего, приходилось думать об использовании как структур данных, так и работающих алгоритмов. по этим структурам данных.

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

Среди наиболее распространенных алгоритмов сортировки:

  • Вставка сортировки
  • Пузырьковая сортировка
  • Выбор Сортировка
  • Сортировка слиянием
  • Быстрая сортировка

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

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

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

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

Лучшее время для использования этого алгоритма:

  • Когда набор данных относительно невелик
  • Когда элементы в наборе данных уже частично отсортированы

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

Сложность времени выполнения:

Наихудшая производительность: O (n²) - Итак, если в вашем массиве 100 элементов, в худшем случае этот алгоритм выполнит 10 000 сравнений. Это когда ваш набор данных сортируется полностью противоположно тому, как вы хотите сортировать данные.

Средняя эффективность наблюдения: O (n²) - Среднее значение не будет равно 10 000 сравнений, но оно будет выше, чем время O (n) или O (nlogn).

Лучшая производительность: O (n) - Лучшая производительность - это когда набор данных уже отсортирован, и требуется только итерация каждого элемента в массиве и одно сравнение для каждого элемента в наборе данных. .

Пример фрагмента кода (JavaScript):

function insertionSort(list) {
    const len = list.length;
    for (var i = 1; i < len; i++) {
        var tmp = list[i];
	for (var j = i - 1; j >= 0 && (list[j] > tmp); j--){
            list[j + 1] = list[j];
	}
        list[j + 1] = tmp;
    }
}

Пузырьковая сортировка

Пузырьковая сортировка - еще один алгоритм, который относительно легко реализовать. Краткое описание того, как работает этот алгоритм, таково: Сравнивайте пары элементов за раз, меняя их местами, если первый элемент в паре больше, чем второй элемент в паре. Например, сравнивая пару элементов [8, 3], после сравнения пары порядок будет [3, 8]. Вы продолжаете делать это попарно по всему набору данных, пока не дойдете до последней пары элементов. Для каждой итерации набора данных будет выполнено n-x сравнений, где x - текущая итерация набора данных (индекс на основе 0).

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

Лучшее время для использования этого алгоритма:

  • Когда набор данных относительно невелик
  • Когда элементы в наборе данных уже частично отсортированы

* Примечание. Этот алгоритм не рекомендуется использовать для больших наборов данных. Особенно те, где элементы могут быть почти полностью отсортированы в обратном порядке.

Сложность времени выполнения:

Наихудшая производительность: O (n²) - Итак, если в вашем массиве 100 элементов, в худшем случае этот алгоритм выполнит 10 000 сравнений. Это когда ваш набор данных сортируется полностью противоположно тому, как вы хотите сортировать данные.

Средняя эффективность наблюдения: O (n²) - Среднее значение не будет равно 10 000 сравнений, но оно будет выше, чем время O (n) или O (nlogn).

Лучшая производительность: O (n) - Лучшая производительность - это когда набор данных уже отсортирован, и требуется только итерация каждого элемента в массиве и одно сравнение для каждого элемента в наборе данных. .

Пример фрагмента кода (JavaScript):

function bubbleSort(list) {
  const length = list.length;
  for (var i = 0; i < length; i++) {
    for (var j = 0; j < (length - i - 1); j++) {
      if (list[j] > list[j + 1]) {
        var tmp = list[j];
        list[j] = list[j + 1];
        list[j + 1] = tmp;
      }
    }
  }
}

Сортировка выделения

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

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

Лучшее время для использования этого алгоритма:

  • Когда набор данных относительно невелик

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

Сложность времени выполнения:

Наихудший результат: O (n²) - наихудший случай совпадает как с худшим, так и с лучшим случаем. Этому алгоритму все равно нужно будет выполнить O (n²) сравнений, чтобы убедиться, что все в порядке. Это один из недостатков этого конкретного алгоритма.

Средняя производительность: O (n²) - Среднее значение совпадает как с худшим, так и с лучшим случаем. Этому алгоритму все равно нужно будет выполнить O (n²) сравнений, чтобы убедиться, что все в порядке. Это один из недостатков этого конкретного алгоритма.

Лучшая производительность: O (n²) - Лучшая производительность такая же, как и в худшем, и в среднем случае. Этому алгоритму все равно нужно будет выполнить O (n²) сравнений, чтобы убедиться, что все в порядке. Это один из недостатков этого конкретного алгоритма.

Пример фрагмента кода (JavaScript):

function selectionSort(list) {
    const length = list.length;
    for (var i = 0; i < length - 1; i++) {
	var min = i;
	for (var j = i + 1; j < length; j++) {
	    if (list[j] < list[min]) {
		min = j;
	    }
	}
	if (min != i) {
	    //Swap the numbers 
	    var tmp = list[i];
            list[i] = list[min];
	    list[min] = tmp;
	}
    }
}

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

Сортировка слиянием - это более сложный алгоритм, который не так просто реализовать, как описанные выше алгоритмы. Краткое описание того, как работает этот алгоритм, таково: Возьмите весь список и продолжайте разбивать его пополам, пока он не сократится до наименьшего возможного списка, по одному элементу в каждом списке. Затем сравните его со списком, примыкающим к нему, и отсортируйте элементы в этих списках, а затем объедините соседние списки и повторите повторение для следующего набора списков. Продолжайте делать это, пока список не будет отсортирован. Это один из алгоритмов сортировки, который обычно использует рекурсию и решает более серьезную проблему, разбивая ее на более мелкие подзадачи, известные как алгоритмы «разделяй и властвуй».

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

Лучшее время для использования этого алгоритма:

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

Сложность времени выполнения:

Наихудший случай: O (nlogn) - наихудший случай совпадает как с худшим, так и с лучшим случаем.

Средняя производительность: O (nlogn) - Среднее значение совпадает как с худшим, так и с лучшим случаем.

Лучшая производительность: O (nlogn) - Лучшая производительность такая же, как и в худшем, и в среднем случае.

Пример фрагмента кода (JavaScript)

function mergeSort(arr) {
    if (arr.length < 2) {
        return arr;    
    }
    var mid = Math.floor(arr.length / 2);
    var subLeft = mergeSort(arr.slice(0, mid));
    var subRight = mergeSort(arr.slice(mid));
    return merge(subLeft, subRight);
}
function merge(node1, node2) {
    var result = [];
    while (node1.length > 0 && node2.length > 0) {     result.push(node1[0] < node2[0]? node1.shift() : node2.shift());         return result.concat(node1.length? node1 : node2);
}

Быстрая сортировка

Быстрая сортировка - это более сложный алгоритм, который не так просто реализовать, как более простые алгоритмы, описанные в начале этой статьи. Это похоже на сортировку слиянием, поскольку в ней используется подход «разделяй и властвуй». Краткое описание того, как работает этот алгоритм, выглядит следующим образом: Выберите элемент из набора данных, называемый точкой поворота, и это точка, в которой набор данных разделяется. Переместите все элементы в наборе данных, которые меньше значения поворота, которое должно быть перед поворотом. Рекурсивно примените одни и те же шаги для каждого из разделов, созданных на предыдущем шаге.

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

Лучшее время для использования этого алгоритма:

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

Сложность времени выполнения:

Худший случай производительности: O (n²) - Для Quicksort сложность времени выполнения n² является редкостью. Так что это не должно сильно беспокоить.

Средняя эффективность: O (nlogn) - Среднее значение такое же, как и в лучшем случае.

Лучшая производительность: O (nlogn) - Лучшая производительность такая же, как и средняя.

Если вы нашли эту статью полезной, подпишитесь на эту публикацию, если вы хотите увидеть больше похожих!