Некоторые вещи здесь не так.
right[0]=a[N-1]; # <-------------- pretty sure this should just be N-1, not a[N-1]
Второе, может быть, еще хуже, то, что раздел вызывается только один раз .
Вам нужно подумать об этом все до конца То, как вы объясняете свой алгоритм и циклы while (true), из которых вы немедленно выходите, делает это очевидным.
Мой совет: сначала выполните рекурсивную быструю сортировку, чтобы ознакомиться с алгоритмом. Также, чтобы выйти из вашего итеративного мышления. Затем ознакомьтесь с общими методами преобразования рекурсивных методов в итерационные (стеки, динамическое программирование c). Затем примените то, что вы узнали, к быстрой сортировке.
Если вы хотите, вы, конечно, всегда можете искать итеративные реализации быстрой сортировки онлайн. Я нашел тот, который использовал стек вместо рекурсии. Если честно, это хорошее упражнение, но я сомневаюсь, что Quicksort действительно выигрывает от повторения. Другие алгоритмы, тем не менее, безусловно, делают, поэтому практика всегда хороша.