Are you blurring the difference between a "crappy" algorithm and a poorly written program that uses that algorithm? If the quicksort algorithm is "crappy," why does your program at least seem to use it when it tells your computer how to partition the list it the list the machine sorts?
Crappy algorithm because of the pivot selection algorithm used. Crappy style because: it doesn't use the language libraries to increase the readability, it allocates new arrays on each call, it uses arrays and the function takes the length of the list as an argument (C guy who just learned C++?).
The iterators for arrays are just pointers, and arrays decay into pointers at function boundaries anyway so, there is no overhead.Why use arrays instead of iterators? I don't know. Maybe iterators need more overhead than arrays do. Even if you do use an iterator instead of an array, what kind of data structure represents the list while your computer partitions it? That list just might be in an array.
By using iterators you make sure your algorithm can work with any linear sequence that provides random access. The whole point is to not care about what kind of data structure you are sorting. You see, now the C++ version is even more generic than the Haskell solution!!
That explains a lot... to a guy who earned a philosophy degree.