Are you even still paying attention to that thread?

Quick sort sorts through something called partitioning.

Explaining partitioning: You pick an element to partition around called the pivot (or last, in your code). In your code, the algorithm is going to pick the middle one every time. Then you swap the middle and first arguments. Then you walk the array comparing the ith element with the left element, and swapping to arrange it such that everything to the left of 'last' is less than 'left', and everything greater is to the right. This sorts the pivot into its final position, last, which explains the swap at the end.

With one element sorted, you still have to divide the array into two parts and partition each part. When every element has had a chance to be a pivot, the array is sorted.

Code:

( 9, 3, 11, 7, 4, ) pivot=0...
( 9, 3, 11, 7, 4, ) pivot=1...
( 9, 3, 7, 11, 4, ) pivot=2...
( 9, 3, 7, 4, 11, ) pivot=3...
( 4, 3, 7, 9, 11, ) pivot=3...
( 3, 4, 7, ) pivot=0...
( 3, 4, 7, ) pivot=0...
( 4, 7, ) pivot=1...
( 4, 7, ) pivot=1...

You could have done this yourself, you know.