Cайт программиста Ruby, веб-разработчика Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

Алгоритм сортировки путём вставок. Дональд Э. Кнут. Ruby

# encoding: utf-8
# frozen_string_literal: true
#
# @author ESV Corp. (C) 21.09.2026
#
# алгоритм "сортировка путём вставок"
# Д. Кнут "Искусство программирования", т.3 "Сортировка и поиск",
# глава 5.2.1. Сортировка путём вставок
#

# ---
# сортировка методом вставок
def sort_by_inserts(r)

  n = r.size

  puts "sort_by_inserts: nothing to sort" unless n > 1

  puts "Sort by inserts source: #{r.inspect}"

  j = 1;

  while j < n

      t = r[j]
      i = j

      while i > 0

          check = r[i-1]

          break if check < t

          r[i] = check
          i -= 1

      end

      # в оригинальном алгоритме Кнута значение может быть
      # записано в ту же самую позицию
      # видимо потому, что лишняя проверка индексов дополнительно занимает
      # память программы, и ещё и для выполнения требует время
      r[i] = t

      j += 1

  end

  r

end


# ===
# основная программа

puts "Donald E. Knuth algorithm test: sort by inserts"

src_list = [5, 3, 2, 7, 1, -5, 10, 4, -3, 0, 12, 6, 7, 9, 11, 8]

# в процессе сортировки модифицируем исходный массив, поэтому нужна копия
list = src_list.dup

sorted_list = sort_by_inserts(list)

puts "source: #{src_list.inspect}"
puts "sorted: #{sorted_list.inspect}"