Добавляем товарам новое свойство типа Число, например, CART_COUNT: iblock_cart.png

Добавляем обработчик события добавления в корзину. Используем событие D7 OnAfterAdd:

$eventManager = \Bitrix\Main\EventManager::getInstance();

$eventManager->addEventHandler("sale", "\Bitrix\Sale\Internals\Basket::OnAfterAdd", ['CustomEventHandlers', 'increaseCartCounter']);

class CustomEventHandlers
{
    function increaseCartCounter(\Bitrix\Main\Entity\Event $event)
    {
        \Bitrix\Main\Loader::includeModule('iblock');

        $fields = $event->getParameter('fields');
        $catalogIblockId = 1; // IBLOCK_ID каталога
        $currentCount = \CIBlockElement::GetProperty($catalogIblockId, $fields['PRODUCT_ID'], [], ["CODE" => "CART_COUNT"])->fetch();
        \CIBlockElement::SetPropertyValuesEx($fields['PRODUCT_ID'], $catalogIblockId, ['CART_COUNT' => $currentCount['VALUE'] + 1]);
    }
}

По желанию можно заполнить свойство каким-то начальным значением. Например, посчитаем какие товары лежат в настоящее время в корзинах пользователей:

\Bitrix\Main\Loader::includeModule("iblock");
\Bitrix\Main\Loader::includeModule("sale");
$catalogIblockId = 1; // IBLOCK_ID каталога
$counts = \Bitrix\Sale\Internals\BasketTable::getList([
    'filter' => [ 
        '=ORDER_ID' => null,
        'LID' => 's1'
    ],
    'select' => ['PRODUCT_ID', 'RT_CNT'],
    'group' => ['PRODUCT_ID'],
    'runtime' => [
        new \Bitrix\Main\Entity\ExpressionField('RT_CNT', 'COUNT(*)'],
    )
]);

while ($count = $counts->fetch()) {
    \CIBlockElement::SetPropertyValuesEx($count['PRODUCT_ID'], $catalogIblockId, ['CART_COUNT' => $count['RT_CNT']]);
}

Теперь можно использовать свойство CART_COUNT для сортировки, например, в catalog.section:

...
"ELEMENT_SORT_FIELD" => "PROPERTY_CART_COUNT",
"ELEMENT_SORT_ORDER" => "DESC",
...