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