quicksort.go 919 Bytes
package webutility

type QSortDirection int

const (
	QSortAscending  = 0
	QSortDescending = 1
)

// QuickSortable is an interface for quicksorting slices.
type QuickSortable interface {
	Swap(i, j int)
	Compare(i, j int) int
	Len() int
}

// Quicksort quicksorts que.
func Quicksort(que QuickSortable, low, high int, dir QSortDirection) {
	if low >= high {
		return
	}

	if dir != QSortAscending && dir != QSortDescending {
		return
	}

	index := partition(que, low, high, dir)
	Quicksort(que, low, index-1, dir)
	Quicksort(que, index+1, high, dir)
}

func partition(que QuickSortable, low, high int, dir QSortDirection) int {
	i := low - 1
	for j := low; j <= high-1; j++ {
		if dir == QSortAscending {
			if que.Compare(j, high) == -1 {
				i++
				que.Swap(i, j)
			}
		} else if dir == QSortDescending {
			if que.Compare(j, high) == 1 {
				i++
				que.Swap(i, j)
			}
		}
	}
	que.Swap(i+1, high)
	return i + 1
}