Попробую развить простой подход: применить обычный метод сортировки (произвольный). Основной смысл следующий: смешиваем два несортированных массива болтов и гаек в один общий несортированный, каждый элемент при этом помечаем буквами Б (болт) или Г (гайка). Мы получаем обычный массив для обычного алгоритма сортировки, но при сортировке не забываем параллельно сортировать массив маркеров Б/Г. Основной сортируемый массив имеет размерность
, то есть
.
1. Особенность сортировки: нельзя сравнивать одноименные элементы (Б нельзя сравнивать с Б, Г нельзя сравнивать с Г). Можно пробовать сравнивать, но тогда сравнение выдает ошибку, а сравнение при этом не засчитывается (сравнение одноименных элементов безопасно!). Важное предложение: при ошибке сравнения - переходить к следующему/другому элементу (skip). В этом моменте (skip) стандартные алгоритмы сортировки могут отличаться в поведении.
Пусть skip происходит влево или вправо, тогда рано или поздно найдется разноименный элемент, пригодный для сравнения, либо конец массива.
2. Болт и гайка, которые совпали, располагать друг за другом в произвольном порядке, а совпадение помечать массивом маркеров совпадения: С=0 - не совпало, С=1 - совпало. Этот массив также сортировать параллельно с основным массивом. Сортировка останавливается, когда весь массив C состоит из 1.
Итак, можно пробовать применять стандартные алгоритмы сортировки, нужно только дописать алгоритм skip и убедиться в его безопасном внедрении (что не нарушаются инварианты сортировки).