Поскольку в коде используется cout.precision (16), я предполагаю, что list [] - это массив чисел с плавающей запятой или двойных чисел. Однако pivot определяется как тип long int, тогда как он должен иметь тип T:
T pivot = list[(lowerBound + upperBound) / 2];
Если тип pivot указан как long int, это объясняет бесконечный цикл, поскольку внутренние циклы while полагаются на остановку, если любой из списков [i] == pivot и / или list [j] == pivot, что не произойдет, если фактический pivot: list [(lowerBound + upperBound) / 2] точно не равен целому числу.
Еще одна проблема - upperbound = upperbound - 1;Это будет происходить в начальном и каждом рекурсивном экземпляре быстрой сортировки. Вместо этого этот оператор должен быть удален, и начальный вызов для списка размера N должен быть
quickSort(list, 0, N-1);
. Нет необходимости вводить i и j как long int, просто набирается как int, это хорошодостаточно, но это не вызывает никаких проблем.