Cocktail sort is similar to bubble sort except it reverses directions when it reaches the end of the list instead of starting from the beginning. Wikipedia on cocktail sort.

algorithms.sort.cocktail = function(array, predicate){

var found = true;

var length = array.length;

while (found) {

found = false;

for (var i = 0; i < length - 1; i++) {

if (!predicate(array, i, i + 1)) {

array.swap(i, i + 1);

found = true;

}

}

if (!found)

break;

for (var i = length - 1; i > 1; i--) {

if (predicate(array, i, i - 1)) {

array.swap(i, i - 1);

found = true;

}

}

}

};