#.H1 Quicksort.awk
#.H2 Synopsis
#.P cat numbers | gawk -f quicksort.awk
#.H2 Download
#.P 
#Download from
#.URL http://lawker.googlecode.com/svn/fridge/lib/awk/quicksort1.awk LAWKER.
#.H2 Description
#.P
#Some Awk implementations come with built in sort routines (e.g. Gawk's asort and asorti functions). But it
#can be useful to code these yourself, especially in you are doing data structure tricks.
#.P
#Quicksort selects a pivot and divides the data into values above and below the pivot. Sorting then
#recurses on these sub-lists.
#.H2 Code
#.H3 Loading the data
#.PRE
#BEGIN { RS = ""; FS = "\n" }
      { A[NR] = $1 } 
END {
	qsort(A, 1, NR)
	for (i = 1; i <= NR; i++) {
		print A[i] #+ 0;
		#if (i == NR) break
		#print ""
	}
}
#./PRE
#.H3 Sorting the data
#.PRE
function qsort(A, left, right,   i, last) {
	if (left >= right)
		return
	swap(A, left, left+int((right-left+1)*rand()))
	last = left
	for (i = left+1; i <= right; i++)
	{
		if (A[i] < A[left])
		{
			swap(A, ++last, i)
		}
	}
	swap(A, left, last)
	qsort(A, left, last-1)
	qsort(A, last+1, right)
}
function swap(A, i, j,   t) {
	t = A[i]; A[i] = A[j]; A[j] = t
}
#./PRE
#.H2 See also
#.P
#.URL http://awk.info/?quicksort2 quicksort2.awk
#.H2 Authors
#.P Alfred Aho, Peter Weinberger,  Brian Kernighan, 1988.
