Во втором случае, я не думаю, что это правильно сортирует, т.к. в переменную b всегда ноль записывается. Переменную tmp нужно переменной a инициализировать.
Время нужна считать с учётом включенных оптимизаций. Например в релизном режиме, с флагом -Ofast или -O3 результаты будут сильно быстрее (в том числе и для std::swap). С похожими параметрами обычно компилируются программы, которые поставляются конечному пользователю.
В режиме отладки, который обычно активирован по умолчанию, компилятор не применяет множество оптимизаций и генерирует отладочную информацию, чтобы программисту легче было разрабатывать. Узнать, какой код был сгенерирован в зависимости от флагов компиляторы, можно тут:
https://godbolt.org/ .
Чтобы понять, какая часть программы потребляет больше всего ресурсов, пользуйтесь профайлерами. Например valgrind с соответствующими флагами.