| 'use strict'; | 
| var arraySlice = require('../internals/array-slice'); | 
|   | 
| var floor = Math.floor; | 
|   | 
| var sort = function (array, comparefn) { | 
|   var length = array.length; | 
|   | 
|   if (length < 8) { | 
|     // insertion sort | 
|     var i = 1; | 
|     var element, j; | 
|   | 
|     while (i < length) { | 
|       j = i; | 
|       element = array[i]; | 
|       while (j && comparefn(array[j - 1], element) > 0) { | 
|         array[j] = array[--j]; | 
|       } | 
|       if (j !== i++) array[j] = element; | 
|     } | 
|   } else { | 
|     // merge sort | 
|     var middle = floor(length / 2); | 
|     var left = sort(arraySlice(array, 0, middle), comparefn); | 
|     var right = sort(arraySlice(array, middle), comparefn); | 
|     var llength = left.length; | 
|     var rlength = right.length; | 
|     var lindex = 0; | 
|     var rindex = 0; | 
|   | 
|     while (lindex < llength || rindex < rlength) { | 
|       array[lindex + rindex] = (lindex < llength && rindex < rlength) | 
|         ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++] | 
|         : lindex < llength ? left[lindex++] : right[rindex++]; | 
|     } | 
|   } | 
|   | 
|   return array; | 
| }; | 
|   | 
| module.exports = sort; |