На первом проходе разбиения вы разделяетесь на два раздела. Это занимает O (N). На следующем проходе у вас есть два раздела, каждый из которых имеет размер n / 2. Требуется O (n / 2), чтобы разделить каждый из них. Общее время для второго прохода составляет O (n / 2 + n / 2): O (n). Каждый проход имеет больше разделов, но разделов меньше. В общей сложности вы выполняете log (n) проходов, каждый из которых требует O (n) общего времени.
Он работает точно так же, как рекурсивная версия. Единственное отличие состоит в том, что в итерационной версии вы управляете стеком явно, а не зависите от неявного стека в рекурсивной версии.