Quick-sort array between from and to indices

Worst case: O(n^2), Average case: O(n lg n)

var a = [5, 2, 3, 1, 4]
default_comparator.quick_sort(a, 0, a.length - 1)
assert a == [1, 2, 3, 4, 5]
var a2 = new Array[Int]
default_comparator.quick_sort(a2, 0, a2.length - 1)
assert a2 == new Array[Int]
var a3 = [1]
default_comparator.quick_sort(a3, 0, a3.length - 1)
assert a3 == [1]

Property definitions

core $ Comparator :: quick_sort
	# Quick-sort `array` between `from` and `to` indices
	# Worst case: O(n^2), Average case: O(n lg n)
	#
	#     var a = [5, 2, 3, 1, 4]
	#     default_comparator.quick_sort(a, 0, a.length - 1)
	#     assert a == [1, 2, 3, 4, 5]
	#     var a2 = new Array[Int]
	#     default_comparator.quick_sort(a2, 0, a2.length - 1)
	#     assert a2 == new Array[Int]
	#     var a3 = [1]
	#     default_comparator.quick_sort(a3, 0, a3.length - 1)
	#     assert a3 == [1]
	fun quick_sort(array: Array[COMPARED], from: Int, to: Int) do
		if from >= to then return
		var pivot = array[from]
		var i = from
		var j = to
		while j > i do
			while i <= to and compare(array[i], pivot) <= 0 do i += 1
			while j > i and compare(array[j], pivot) >= 0 do j -= 1
			if j > i then
				var t = array[i]
				array[i] = array[j]
				array[j] = t
			end
		end
		array[from] = array[i-1]
		array[i-1] = pivot
		sub_sort(array, from, i-2)
		sub_sort(array, i, to)
	end
lib/core/collection/sorter.nit:103,2--133,4