Надо проверять, как элементы соотносятся с граничным значением. Если оба меньше, то ничего не делаем; если только один меньше, тогда другой должен уехать вперёд; оба должны быть подвергнуты сортировке - действуем как обычно. Вот так всё просто получается:
const arr = [5, 7, 10, 100, 65, 43, 63, 15, 18, 70, 1, 3];
const minToSort = 10;
arr.sort((a, b) => (
a < minToSort ? +(b >= minToSort) :
b < minToSort ? -1 :
b - a
));
console.log(arr); // [100, 70, 65, 63, 43, 18, 15, 10, 5, 7, 1, 3]
Или, можно решить задачу в более общем виде - cделаем функцию частичной сортировки. Раскладываем значения в два массива; один сортируем, другой нет; объединяем их. Тоже ничего сложного:
function toPartiallySorted(data, {
sort = () => true,
key = n => n,
prepend = true,
} = {}) {
const getKey = key instanceof Function ? key : n => n[key];
const toSort = [];
const result = [];
let i = -1;
for (const n of data) {
if (sort(n, ++i)) {
toSort.push([ getKey(n), n ]);
} else {
result.push(n);
}
}
toSort.sort(([a], [b]) => a < b ? -1 : +(a > b));
result.splice(prepend ? 0 : result.length, 0, ...toSort.map(n => n[1]));
return result;
}
Как применить эту функцию в вашем случае:
arr.splice(0, arr.length, ...toPartiallySorted(arr, {
sort: n => n >= minToSort,
key: n => -n,
}));
Элементами массива могут быть не только числа, но и, например, объекты:
toPartiallySorted([{x:3}, {x:6}, {x:1}, {x:5}, {x:2}, {x:4}], {
sort: (_, i) => i < 3,
key: 'x',
prepend: false,
}) // [{x:5}, {x:2}, {x:4}, {x:1}, {x:3}, {x:6}]
Или это может быть не массив, а строка:
toPartiallySorted('hello, world!!', { sort: n => n <= 'h' }).join('') // ' !!,dehlloworl'
Да хоть коллекция DOM-элементов:
<table>
<tbody>
<tr><td>216</td></tr>
<tr><td>-789</td></tr>
<tr><td>-3</td></tr>
<tr class="no-sort"><td>58</td></tr>
<tr><td>124</td></tr>
<tr class="no-sort"><td>-100</td></tr>
</tbody>
</table>
const [ tbody ] = document.querySelector('table').tBodies;
tbody.append(...toPartiallySorted(tbody.rows, {
sort: n => !n.classList.contains('no-sort'),
key: n => +n.textContent,
}));