15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// quicksort
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function sort_quick(sort, left, right) {
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (arguments.length == 1) {
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    left = 0;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    right = sort.size - 1;
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (left < right) {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pivot = left + Math.floor(Math.random()*(right-left));
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //var pivot = Math.floor(left + (right-left)/2);
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    partition(sort, left, right, pivot);
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function partition(sort, left, right, pivot) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sort.swap(pivot, right);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sort.add_work(function(){partition_step(sort, left, right, pivot, left, left);});
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function partition_step(sort, left, right, pivot, i, j) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (i < right) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sort.compare(i, right) <= 0) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sort.swap(i, j);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      j++;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i++;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sort.add_work(function(){partition_step(sort, left, right, pivot, i, j)});
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sort.swap(j, right);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sort.add_work(function(){sort_quick(sort, left, j-1)});
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sort.add_work(function(){sort_quick(sort, j+1, right)});
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35