Guest User

Jsnsjakakak

a guest
Jul 7th, 2025
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function mergeSort(comparator, inPlace = false) {
  2. const original = this;
  3. const n = original?.length >>> 0;
  4.  
  5. if (!original || typeof original !== 'object')
  6. throw new TypeError('mergeSort must be called on an array-like object');
  7. if (!Number.isFinite(n) || n < 0)
  8. throw new TypeError('Invalid length on array-like object');
  9. if (typeof comparator !== 'function' && comparator != null)
  10. throw new TypeError('Comparator must be a function');
  11. if (inPlace && Object.isFrozen(original))
  12. throw new TypeError('Cannot sort in-place a frozen object');
  13. if (n < 2) return inPlace ? original : original.constructor.from(original);
  14.  
  15. const smartComparator = (a, b) => {
  16. if (a === b) return 0;
  17. if (a == null) return -1;
  18. if (b == null) return 1;
  19. if (typeof a === 'number' && typeof b === 'number') return a - b;
  20. if (typeof a === 'string' && typeof b === 'string') return a.localeCompare(b);
  21. if (typeof a === 'boolean' && typeof b === 'boolean') return a - b;
  22. try {
  23. const va = a.valueOf?.(), vb = b.valueOf?.();
  24. if (typeof va === 'number' && typeof vb === 'number') return va - vb;
  25. if (typeof va === 'string' && typeof vb === 'string') return va.localeCompare(vb);
  26. } catch {}
  27. try {
  28. return String(a).localeCompare(String(b));
  29. } catch {}
  30. throw new TypeError(Cannot compare values: ${a} and ${b});
  31. };
  32.  
  33. const cmp = comparator ?? smartComparator;
  34. const arr = inPlace ? original : [...original];
  35. const buffer = new Array(n);
  36. const threshold = 32;
  37.  
  38. function insertionSort(start, end) {
  39. for (let i = start + 1; i < end; i++) {
  40. const temp = arr[i];
  41. let j = i - 1;
  42. while (j >= start && cmp(arr[j], temp) > 0) {
  43. arr[j + 1] = arr[j--];
  44. }
  45. arr[j + 1] = temp;
  46. }
  47. }
  48.  
  49. function merge(start, mid, end) {
  50. let i = start, j = mid, k = start;
  51.  
  52. while (i < mid && j < end) {  
  53.   buffer[k++] = cmp(arr[i], arr[j]) <= 0 ? arr[i++] : arr[j++];  
  54. }  
  55. while (i < mid) buffer[k++] = arr[i++];  
  56. while (j < end) buffer[k++] = arr[j++];  
  57.  
  58. for (let m = start; m < end; m++) arr[m] = buffer[m];
  59.  
  60. }
  61.  
  62. function sort(start, end) {
  63. const size = end - start;
  64. if (size <= threshold) {
  65. insertionSort(start, end);
  66. return;
  67. }
  68.  
  69. const mid = (start + end) >>> 1;  
  70. sort(start, mid);  
  71. sort(mid, end);  
  72.  
  73. if (cmp(arr[mid - 1], arr[mid]) <= 0) return; // skip merge if already sorted  
  74. merge(start, mid, end);
  75.  
  76. }
  77.  
  78. sort(0, n);
  79. return inPlace ? original : original.constructor.from(arr);
  80. }
  81.  
  82.  
Advertisement
Add Comment
Please, Sign In to add comment