"в одном месте, и вот, и привет будут стоять в индексе 1" -> НЕПРАВИЛЬНО
Из написанной вами программы ясно, что lo будет с индексом 1, а hi с индексом 0. Так что следующее условие if будет пропущено, и будет выполнена последняя строка, меняющая значения двух индексов
if(lo < hi) //THE FOLLOWING STATEMENT WILL BE SKIPPED
{
ArrayUtil.swap(a, lo++, hi--);
}
Результирующий массив будет {84, 26, 98, 45}. что именно то, что вы получаете. Вы должны внести следующие изменения
while(a[lo] <= a[pivot]) lo++;
while(a[hi] > a[pivot]) hi--;
становится
while(a[lo + 1] <= a[pivot]) lo++;
while(a[hi - 1] > a[pivot]) hi--;
Также, как уже указывали другие, попробуйте изменить
ArrayUtil.swap(a, lo++, hi--);
до
ArrayUtil.swap(a, lo, hi);
P.S. Я думаю, что операторы увеличения и уменьшения - это зло. Нужно действительно обращать внимание на поведение post / pre при их использовании. Старайтесь избегать их как можно больше.