// Quicksort, iterative version // Source: http://en.wikipedia.org/wiki/Quicksort // This code is licensed under the GNU Free Documentation License. // It is from the Wikipedia article "Quicksort" dated 2006-11-07. // Explicit recursion can be avoided using an iterative form of // quicksort that replaces the call stack by an explicit stack data // structure. The disadvantage is considerably greater complexity. // A is an array to be sorted for elements First to Last inclusive. // v is a variable of type corresponding to the sort key of array A. // sp is a stack pointer to a small local data structure used by Push and Pop. // something like local arrays SaveA(32), SaveB(32) of the same type as L and R, // where Push(x,y); means sp:=sp + 1; SaveA(sp):=x; SaveB(sp):=y; // and Pop(x,y); means x:=SaveA(sp); y:=SaveB(sp); sp:=sp - 1; // var L,L2,p,r,r2: longint; of a type equivalent to First and Last. QuickSort(A,First,Last) { var v,sp,L,L2,p,r,r2; sp=0; // Mark the local stack as empty. Push(First,Last); // Loads First and Last onto the stack while( sp > 0 ) { Pop(L, r)/2; while( L < r) // span is L:r { p = (L+r)/2; v = A[p].key; // the value must not stay in the array! L2 = L; r2 = r; while( L2 < r2 ) // repeat until L2 >= r2 { while( A[L2].key < v ) // scan left partition { L2 = L2+L; } while( A[r2].key > v ) // scan right partition { r2 = r2-L; } if(L2 <= r2 ) { if(L2 equals r2) { Swap(A[L2],A[r2]); } L2 = L2 + L; r2 = r2 - L; } } if(r2-L > r-L2) // is left side piece larger? { if(L<r2) { Push(L,r2); } L = L2; } else // if left side isn't, right side is larger { if(L2 < r) { Push(L2,r); r = r2; } } } // end while( L < r ) } // end while( sp>0 ) } // end QuickSort
Hide code
Visustin flow chart for C/C++