(array, compare, lo, hi)
| 6429 | } |
| 6430 | |
| 6431 | function sort(array, compare, lo, hi) { |
| 6432 | if (!lo) { |
| 6433 | lo = 0; |
| 6434 | } |
| 6435 | if (!hi) { |
| 6436 | hi = array.length; |
| 6437 | } |
| 6438 | |
| 6439 | var remaining = hi - lo; |
| 6440 | |
| 6441 | if (remaining < 2) { |
| 6442 | return; |
| 6443 | } |
| 6444 | |
| 6445 | var runLength = 0; |
| 6446 | |
| 6447 | if (remaining < DEFAULT_MIN_MERGE) { |
| 6448 | runLength = makeAscendingRun(array, lo, hi, compare); |
| 6449 | binaryInsertionSort(array, lo, hi, lo + runLength, compare); |
| 6450 | return; |
| 6451 | } |
| 6452 | |
| 6453 | var ts = new TimSort(array, compare); |
| 6454 | |
| 6455 | var minRun = minRunLength(remaining); |
| 6456 | |
| 6457 | do { |
| 6458 | runLength = makeAscendingRun(array, lo, hi, compare); |
| 6459 | if (runLength < minRun) { |
| 6460 | var force = remaining; |
| 6461 | if (force > minRun) { |
| 6462 | force = minRun; |
| 6463 | } |
| 6464 | |
| 6465 | binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); |
| 6466 | runLength = force; |
| 6467 | } |
| 6468 | |
| 6469 | ts.pushRun(lo, runLength); |
| 6470 | ts.mergeRuns(); |
| 6471 | |
| 6472 | remaining -= runLength; |
| 6473 | lo += runLength; |
| 6474 | } while (remaining !== 0); |
| 6475 | |
| 6476 | ts.forceMergeRuns(); |
| 6477 | } |
| 6478 | |
| 6479 | // Use timsort because in most case elements are partially sorted |
| 6480 | // https://jsfiddle.net/pissang/jr4x7mdm/8/ |
no test coverage detected