Почему быстрая сортировка Хоара медленнее пузырьковой?
Во-первых, quicksort медленне всяких пузырьков на маленьких числах. Это нормально. У него ассимптотика лучше - он сильно быстрее на больших числах. Но константа из-за сложности алгоритма хуже - поэтому на маленьких числах он и проигрывает пузырьку. Во всех библиотечных реализациях квиксорта (да и любой другой логарифмической сортировки) там есть проверка, что если чисел мало, то запускать пузырек или сортировку вставками.

Увеличте размер сортруемых массивов до 100 000 или до миллиона и квиксорт должен стать быстрее.

Во-вторых, ваша быстрая сортировка написана весьма неоптимально. Пузырек у вас сортирует сам массив на месте, когда как квиксорт постоянно создает новые массивы через конкатенацию. Возьмите нормальную реализацию и на 1000 элементах квиксорт уже станет быстрее пузырька.
Дело не в реализации.
Быстрая сортировка она действительно "быстрая" в случае частично-упорядоченных массивов (которые в реальных задачах могут встречаться не реже, чем полностью неупорядоченные).  Причем для корректного исследования не достаточно взять фиксированное количество элементов, а необходимо выполнить сравнения при разном N. И вообще, в O()-нотации, это не столько о времени конкретного выполнения, сколько о том, как изменяется (растет) время выполнения алгоноитма в зависимости от N.

Вопрос обсуждается в интернет в огромном количестве статей. Ну например:
https://habr.com/ru/post/274017/
https://works.doklad.ru/view/w4c2OLj2iMk.html