
function Sorter(_data)
{
	var i;
	
	this.data = _data;
	this.comparers = [];
	for (i = 1; i < arguments.length; ++i)
		this.comparers.push(arguments[i]);
	
	this.swap = function(i, j)
	{
		var tmp;
		
		tmp = this.data[i];
		this.data[i] = this.data[j];
		this.data[j] = tmp;
	}
	
	this.partition = function(left, right)
	{
		var i, j, index, tester, compare_func;

		index = left + Math.round(Math.random()*(right-left-1));
		
		this.swap(left, index);
		index = left;
		tester = this.data[index];
		for (i = left + 1; i <= right; ++i) 
		{
			for (j = 0; j < this.comparers.length; ++j)
			{
				compare_func = this.comparers[j];
				if (compare_func(tester, this.data[i]))
				{
					++index;
					this.swap(index, i);
					break;
				}
			}
		}
		this.swap(left, index);
		return index;
	}
	
	this.sort = function(start, end)
	{
		var pivot_index;
		
		if ((end - start) > 0)
		{
			pivot_index = this.partition(start, end);
			this.sort(start, pivot_index - 1);
			this.sort(pivot_index + 1, end);
		}
	}
	
	this.sort(0, this.data.length - 1);
}

