49d72980dbb0d0d110e614d7ab9575b6669c19860186a923fc33e8ab1061542c411c030d5aa838ee8fe7f58d20ca95ddd8c112540dad75f621c086b38bf37b 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. 'use strict';
  2. var arraySlice = require('../internals/array-slice');
  3. var floor = Math.floor;
  4. var sort = function (array, comparefn) {
  5. var length = array.length;
  6. if (length < 8) {
  7. // insertion sort
  8. var i = 1;
  9. var element, j;
  10. while (i < length) {
  11. j = i;
  12. element = array[i];
  13. while (j && comparefn(array[j - 1], element) > 0) {
  14. array[j] = array[--j];
  15. }
  16. if (j !== i++) array[j] = element;
  17. }
  18. } else {
  19. // merge sort
  20. var middle = floor(length / 2);
  21. var left = sort(arraySlice(array, 0, middle), comparefn);
  22. var right = sort(arraySlice(array, middle), comparefn);
  23. var llength = left.length;
  24. var rlength = right.length;
  25. var lindex = 0;
  26. var rindex = 0;
  27. while (lindex < llength || rindex < rlength) {
  28. array[lindex + rindex] = (lindex < llength && rindex < rlength)
  29. ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]
  30. : lindex < llength ? left[lindex++] : right[rindex++];
  31. }
  32. }
  33. return array;
  34. };
  35. module.exports = sort;