Простые типы алгоритмов сортировки
- Пузырьковая сортировка ➝ O(n²)
- Сортировка вставками➝ O(n²)
- Сортировка выбором ➝ O (n²)
- Сортировка слиянием ➝ O (n * log n)
- Быстрая сортировка ➝ среднее: O(n * log n), наихудшее: O(n²)
Что такое сортировка вставками? Вот короткое видео, иллюстрирующее процесс.
Это один из самых простых алгоритмов сортировки. По сути, вы просматриваете каждый отдельный элемент в массиве/списке, начиная слева направо, а затем перемещая текущий элемент влево, пока он не окажется в правильном положении.
Сложность в наихудшем случае: O(n²)
Сложность пространства в наихудшем случае: O(1), если выполняется сортировка по месту.
Основные шаги для реализации сортировки вставками в списке, скажем, [5, 4, 3, 2, 1]:
- Начните слева и двигайтесь до конца справа
2. Сравните текущий элемент с элементом слева от него.
3. Если текущий элемент меньше, поменять местами его с левым
4. Продолжайте сравнивать и менять местами влево, пока текущий элемент не окажется на своем месте.
5. Как только он окажется в нужном месте, перейдите к следующему элементу. В нашем текущем примере перейдите ко второму индексу, который равен 3.
6. Затем снова продолжите сравнение и замену. Продолжайте, пока все элементы не будут отсортированы
Вот код на JavaScript:
const insertionSort = (array) => { // we start at index 1 because we know the first element // is already sorted for (let i = 1; i < array.length; i++) { // initialize left and right indices and elements let rightIdx = i let right = array[rightIdx] let leftIdx = rightIdx - 1 let left = array[leftIdx] // if not at the beginning and left is greater than right while (leftIdx >= 0 && (left > right)) { // move the element to the left by // swapping the left and right elements swap(array, leftIdx, rightIdx) // move pointers to the left, so left // and right elements are repositioned leftIdx-- rightIdx-- left = array[leftIdx] right = array[rightIdx] } } return array } const swap = (array, left, right) => { let temp = array[right] array[right] = array[left] array[left] = temp } console.log(insertionSort([3, 2, 1])) // [1, 2, 3]
Сложность в наихудшем случае: O(n²)
Сложность пространства в наихудшем случае: O(1), если выполняется сортировка по месту.
Когда использовать сортировку вставками?
- Когда количество элементов невелико
- Это также может быть полезно, когда входной массив почти отсортирован, например, когда элементы неуместны в большом массиве.
Пример проблемы:
Отсортируйте полуотсортированный массив, в котором несортированные элементы находятся на k мест от его правильной позиции сортировки.
inputArray = [1, 2, 3, 4, 5, 6, 7, 8, 12, 9, 10, 11], k = 3
Единственный элемент, который не отсортирован, — это значение 12 в индексе 8, которое должно быть в индексе 11.