Задача №12

Сформувати масив з 1000 елементів від 1 до 800. Порівняти час сортування бульбашкою і вставкою.


Рішення:

'use strict'

/**
 * @param {number} min
 * @param {number} max
 */
function getRandomInteger(min, max) {
  return min + Math.floor(Math.random() * (max - min + 1))
}

/**
 * @param {number} size
 * @param {number} min
 * @param {number} max
 */
function createRandomArray(size, min, max) {
  return Array.from({length: size}, () => getRandomInteger(min, max))
}

function swap(list, index1, index2) {
  ;[list[index1], list[index2]] = [list[index2], list[index1]]
}

/**
 * @param {number[]} list
 * @param {boolean} [inPlace=true]
 */
function bubbleSort(list, inPlace = true) {
  const arr = inPlace ? list : [...list]

  let right = arr.length - 1

  while (right) {
    let newRight = 0

    for (let left = 0; left < right; left++) {
      if (arr[left] > arr[left + 1]) {
        swap(arr, left, left + 1)
        newRight = left
      }
    }

    right = newRight
  }

  return arr
}

/**
 * @param {number[]} list
 * @param {boolean} [inPlace=true]
 */
function insertionSort(list, inPlace = true) {
  const arr = inPlace ? list : [...list]

  for (let left = 1; left < arr.length; left++) {
    const cachedEl = arr[left]
    let i = left - 1

    while (i >= 0 && arr[i] > cachedEl) {
      arr[i + 1] = arr[i]
      i--
    }

    if (i + 1 !== left) {
      arr[i + 1] = cachedEl
    }
  }

  return arr
}

/**
 *
 * @param {number} times
 * @param {Function} fn
 * @param  {...any} params
 * @returns {number}
 */
function benchmark(times, fn, ...params) {
  const start = Date.now()

  for (let i = 0; i < times; i++) {
    fn(...params)
  }

  return Date.now() - start
}

// =============================================================================

const randomList = createRandomArray(1e3, 1, 800)

let bubbleTime = 0
let insertionTime = 0

for (let i = 0; i < 10; i++) {
  bubbleTime += benchmark(10, bubbleSort, randomList, false)
  insertionTime += benchmark(10, insertionSort, randomList, false)
}

const template = `
<p><b>Кожне сортування проводиться по 100 разів</b>
<p>Сортування бульбашкою: ${bubbleTime} мс
<p>Сортування включенням: ${insertionTime} мс
<p>Різниця (бульбашкою мінус включенням): ${bubbleTime - insertionTime} мс
`
document.querySelector('.js-app')?.insertAdjacentHTML('beforeend', template)