Knowledge

Timsort

Source 📝

510:
before and after these locations are already in their correct place and do not need to be merged. Then, the smaller of these shrunk runs is copied into temporary memory, and the copied elements are merged with the larger shrunk run into the now free space. If the leftmost shrunk run is smaller, the merge proceeds from left to right. If the rightmost shrunk run is smaller, merging proceeds from right to left (i.e. beginning with elements at the ends of the temporary space and leftmost run, and filling the free space from its end). This optimization reduces the number of required element movements, the running time and the temporary space overhead in the general case.
327: 567: 494: 612: 531: 514:
element of the first run is 10 and it would have to be added at the fifth position of the second run in order to preserve its order. Therefore, and are already in their final positions and the runs in which elements movements are required are and . With this knowledge, we only need to allocate a temporary buffer of size 2 instead of 4.
264:. The algorithm finds subsequences of the data that are already ordered (runs) and uses them to sort the remainder more efficiently. This is done by merging runs until certain criteria are fulfilled. Timsort was Python's standard sorting algorithm from version 2.3 to version 3.10, and is used to sort arrays of non-primitive type in 311:, they are merged. This goes on until all data is traversed; then, all runs are merged two at a time and only one sorted run remains. The advantage of merging ordered runs instead of merging fixed size sub-lists (as done by traditional mergesort) is that it decreases the total number of comparisons needed to sort the entire list. 578:. According to benchmarks done by the developer, galloping is beneficial only when the initial element of one run is not one of the first seven elements of the other run. This implies an initial threshold of 7. To avoid the drawbacks of galloping mode, two actions are taken: (1) When galloping is found to be less efficient than 546:), Timsort considers that it is likely that many consecutive elements may still be selected from that run and switches into galloping mode. Let us assume that R1 is responsible for triggering it. In this mode, the algorithm performs a two-stage search for the place in the run R1 where the next element 501:
The original merge sort implementation is not in-place and it has a space overhead of N (data size). In-place merge sort implementations exist, but have a high time overhead. In order to achieve a middle term, Timsort performs a merge sort with a small time overhead and smaller space overhead than N.
513:
Example: two runs and must be merged. Note that both runs are already sorted individually. The smallest element of the second run is 4 and it would have to be added at the fourth position of the first run in order to preserve its order (assuming that the first position of a run is 1). The largest
602:
In order to also take advantage of data sorted in descending order, Timsort reverses strictly descending runs when it finds them and adds them to the stack of runs. Since descending runs are later blindly reversed, excluding runs with equal elements maintains the algorithm's stability; i.e., equal
509:
to find the location where the first element of the second run would be inserted in the first ordered run, keeping it ordered. Then, it performs the same algorithm to find the location where the last element of the first run would be inserted in the second ordered run, keeping it ordered. Elements
797:
also has good aspects: It's stable (items that compare equal retain their relative order, so, e.g., if you sort first on zip code, and a second time on name, people with the same name still appear in order of increasing zip code; this is important in apps that, e.g., refine the results of queries
480:
and the invariants are checked again. Once the invariants hold, the search for a new run in the data can start. These invariants maintain merges as being approximately balanced while maintaining a compromise between delaying merging for balance, exploiting fresh occurrence of runs in
409:
In order to achieve sorting stability, only consecutive runs are merged. Between two non-consecutive runs, there can be an element with the same key inside the runs. Merging those two runs would change the order of equal keys. Example of this situation ( are ordered runs): 1 4 2
734:
of Java software, the researchers found that this check is not sufficient, and they were able to find run lengths (and inputs which generated those run lengths) which would result in the invariants being violated deeper in the stack after the top of the stack was merged.
738:
As a consequence, for certain inputs the allocated size is not sufficient to hold all unmerged runs. In Java, this generates for those inputs an array-out-of-bound exception. The smallest input that triggers this exception in Java and Android v7 is of size
718:
Specifically, the invariants on stacked run sizes ensure a tight upper bound on the maximum size of the required stack. The implementation preallocated a stack sufficient to sort 2 bytes of input, and avoided further overflow checks.
759:
The Java implementation was corrected by increasing the size of the preallocated stack based on an updated worst-case analysis. The article also showed by formal methods how to establish the intended invariant by checking that the
1106:
The current algorithm is an adaptive, iterative merge sort inspired by timsort. It is designed to be very fast in cases where the slice is nearly sorted, or consists of two or more sorted sequences concatenated one after
619:
Because merging is most efficient when the number of runs is equal to, or slightly less than, a power of two, and notably less efficient when the number of runs is slightly more than a power of two, Timsort chooses
634:, is equal to, or slightly less than, a power of two. The final algorithm takes the six most significant bits of the size of the array, adds one if any of the remaining bits are set, and uses that result as the 558:
such that R1 < x <= R1, i.e. a region of uncertainty comprising 2 − 1 consecutive elements of R1. The second stage performs a straight binary search of this region to find the exact location in R1 for
590:
is reduced by one, thus encouraging the return to galloping mode. Otherwise, the value is incremented by one, thus discouraging a return to galloping mode. In the case of random data, the value of
707:
for sorting object references or pointers because these require expensive memory indirection to access data and perform comparisons and Quicksort's cache coherence benefits are greatly reduced.
497:
To merge, Timsort copies the elements of the smaller array (X in this illustration) to temporary memory, then sorts and fills elements in final order into the combined space of X and Y.
1224:
de Gouw, Stijn; Rot, Jurriaan; de Boer, Frank S.; Bubel, Richard; Hähnle, Reiner (July 2015). "OpenJDK's Java.utils.Collection.sort() is Broken: The Good, the Bad and the Worst Case".
980: 764:
topmost runs in the stack satisfy the two rules above. This approach was initially adopted by Python until it switched to Powersort in 2022 with the release of Python 3.11.
715:
In 2015, Dutch and German researchers in the EU FP7 ENVISAGE project found a bug in the standard implementation of Timsort. It was fixed in 2015 in Python, Java and Android.
690: 179: 90: 406:
Timsort is a stable sorting algorithm (order of elements with same key is kept) and strives to perform balanced merges (a merge thus merges runs of similar sizes).
314:
Each run has a minimum size, which is based on the size of the input and is defined at the start of the algorithm. If a run is smaller than this minimum run size,
219: 130: 1027:
Code stolen in large part from Python's, listobject.c, which itself had no license header. However, thanks to Tim Peters for the parts of the code I ripped-off.
307:. It iterates over the data collecting elements into runs and simultaneously putting those runs in a stack. Whenever the runs on the top of the stack match a 853:
TimSort is an intriguing sorting algorithm designed in 2002 for Python, whose worst-case complexity was announced, but not proved until our recent preprint.
1263: 988: 1151: 534:
Elements (pointed to by blue arrow) are compared and the smaller element is moved to its final position (pointed to by red arrow).
538:
An individual merge of runs R1 and R2 keeps the count of consecutive elements selected from a run. When this number reaches the
1246: 696:
elements. In the best case, which occurs when the input is already sorted, it runs in linear time, meaning that it is an
1010: 1359: 1130: 930: 831: 638:. This algorithm works for all arrays, including those smaller than 64; for arrays of size 63 or less, this sets 563:. Galloping mode is an attempt to adapt the merge algorithm to the pattern of intervals between elements in runs. 1382: 1690: 257: 1174: 291:
It uses techniques from Peter McIlroy's 1993 paper "Optimistic Sorting and Information Theoretic Complexity".
261: 1318: 956:"[#JDK-6804124] (coll) Replace "modified mergesort" in java.util.Arrays.sort with timsort" 651: 281: 185: 136: 96: 47: 522:
Merging can be done in both directions: left-to-right, as in the traditional mergesort, or right-to-left.
1723: 285: 574:
Galloping is not always efficient. In some cases galloping mode requires more comparisons than a simple
570:
All red elements are smaller than blue (here, 21). Thus they can be moved in a chunk to the final array.
269: 1521: 726:
group of three consecutive runs, but the implementation only checked it for the top three. Using the
326: 1823: 1397: 1264:"Proving that Android's, Java's and Python's sorting algorithm is broken (and showing how to fix it)" 1196: 1225: 781: 1695: 1090: 579: 885:
Nearly-Optimal Mergesorts: Fast, Practical Sorting Methods That Optimally Adapt to Existing Runs
657: 146: 57: 1603: 1483: 1437: 1407: 1064: 798:
based on user input). ... It has no bad cases (O(N log N) is worst case; N−1 compares is best).
364:
are merged and replaced on the stack. In this way, merging is continued until all runs satisfy
331: 277: 1159: 1828: 1764: 1352: 242: 615:
Timsort algorithm searches for minimum-size ordered sequences, minruns, to perform its sort.
1743: 1608: 1463: 40: 1299: 1119:
McIlroy, Peter (January 1993). "Optimistic Sorting and Information Theoretic Complexity".
195: 106: 8: 1759: 1498: 749:(2). (Older Android versions already triggered this exception for certain inputs of size 731: 630:
is chosen from the range 32 to 64 inclusive, such that the size of the data, divided by
1649: 1624: 1598: 1402: 908: 888: 837: 551: 1311: 586:. If the selected element is from the same array that returned an element previously, 582:, galloping mode is exited. (2) The success or failure of galloping is used to adjust 1468: 1368: 1242: 1126: 827: 811: 413:
In pursuit of balanced merges, Timsort considers three runs on the top of the stack,
245: 30: 1536: 912: 841: 1710: 1577: 1345: 1234: 955: 898: 817: 256:, designed to perform well on many kinds of real-world data. It was implemented by 238: 188: 1771: 1654: 1526: 1427: 1422: 1412: 1238: 611: 566: 139: 99: 50: 493: 1776: 1685: 1552: 1506: 1432: 1387: 1120: 903: 318:
is used to add more elements to the run until the minimum run size is reached.
315: 253: 1331: 822: 1817: 1644: 1417: 697: 575: 506: 303:
of consecutive ordered elements that already exist in most real-world data,
1659: 1572: 1442: 1122:
Proceedings of the Fourth Annual ACM-SIAM Symposium on Discrete Algorithms
530: 1792: 1634: 1458: 1392: 1284:
Python Issue Tracker – Issue 23515: Bad logic in timsort's merge_collapse
1738: 1718: 1700: 1664: 1593: 1531: 1516: 1478: 1233:. Lecture Notes in Computer Science. Vol. 9206. pp. 273–289. 810:
Auger, Nicolas; Jugé, Vincent; Nicaud, Cyril; Pivoteau, Carine (2018).
273: 249: 1733: 1669: 1639: 1629: 1567: 1562: 1557: 1488: 1473: 1337: 704: 482: 1283: 870:
Patience is a Virtue: Revisiting Merge and Sort on Modern Processors
1802: 1797: 1511: 893: 550:
of the run R2 would be inserted. In the first stage it performs an
642:
equal to the array size and Timsort reduces to an insertion sort.
1039: 887:. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. p. 12. 265: 16:
Hybrid sorting algorithm based on insertion sort and merge sort
722:
However, the guarantee requires the invariants to apply to
727: 1298:
Auger, Nicolas; Nicaud, Cyril; Pivoteau, Carine (2015).
809: 1223: 867: 660: 198: 149: 109: 60: 554:, also known as a galloping search, until finding a 1297: 1175:"Understanding timsort, Part 1: Adaptive Mergesort" 868:Chandramouli, Badrish; Goldstein, Jonathan (2014). 594:becomes so large that galloping mode never recurs. 684: 213: 173: 124: 84: 1146: 1144: 1142: 1815: 1300:"Merge Strategies: from Merge Sort to TimSort" 1139: 863: 861: 525: 485:and making merge decisions relatively simple. 1353: 284:, and inspired the sorting algorithm used in 924: 922: 858: 1360: 1346: 1017:. Lines 23-25 of the initial comment block 1015:Mercurial repository of Octave source code 299:Timsort was designed to take advantage of 1312:"On the Worst-Case Complexity of TimSort" 1219: 1217: 1166: 902: 892: 882: 821: 919: 610: 565: 529: 492: 468:If any of these invariants is violated, 325: 1261: 1172: 1118: 883:Munro, J. Ian; Wild, Sebastian (2018). 624:to try to ensure the former condition. 488: 1816: 1367: 1319:"Strategies for Stable Merge Sorting." 1310:Auger, Jugé, Nicaud, Pivoteau (2018). 1214: 779: 710: 1341: 1173:MacIver, David R. (11 January 2010). 1334:– original explanation by Tim Peters 1262:de Gouw, Stijn (24 February 2015). 981:"Class: java.util.TimSort<T>" 606: 308: 13: 1291: 1194: 1040:"Getting things sorted in V8 · V8" 597: 517: 14: 1840: 1325: 985:Android Gingerbread Documentation 928: 321: 692:comparisons to sort an array of 425:, and maintains the invariants: 1383:Computational complexity theory 1277: 1255: 1188: 1112: 1083: 1057: 1065:"Is sort() stable in Swift 5?" 1032: 1003: 973: 948: 876: 803: 782:"[Python-Dev] Sorting" 773: 679: 664: 472:is merged with the smaller of 208: 202: 168: 153: 119: 113: 79: 64: 1: 1158:. 18 May 2022. Archived from 786:Python Developers Mailinglist 767: 1239:10.1007/978-3-319-21690-4_16 1011:"liboctave/util/oct-sort.cc" 780:Peters, Tim (20 July 2002). 603:elements won't be reversed. 294: 7: 1227:Computer Aided Verification 931:"Python Now Uses Powersort" 645: 540:minimum galloping threshold 526:Galloping mode during merge 330:The runs are inserted in a 262:Python programming language 10: 1845: 1691:Batcher odd–even mergesort 1317:Sam Buss, Alexander Knop. 904:10.4230/lipics.esa.2018.63 685:{\displaystyle O(n\log n)} 505:First, Timsort performs a 174:{\displaystyle O(n\log n)} 85:{\displaystyle O(n\log n)} 1785: 1752: 1709: 1678: 1617: 1586: 1545: 1497: 1451: 1375: 823:10.4230/LIPIcs.ESA.2018.4 224: 184: 135: 95: 46: 36: 26: 1696:Pairwise sorting network 1724:Kirkpatrick–Reisch sort 260:in 2002 for use in the 1604:Oscillating merge sort 1484:Proportion extend sort 1438:Transdichotomous model 1201:CPython git repository 686: 616: 571: 535: 498: 403: 215: 175: 126: 86: 1765:Pre-topological order 687: 614: 569: 533: 496: 329: 216: 176: 127: 87: 1744:Merge-insertion sort 1609:Polyphase merge sort 1464:Cocktail shaker sort 1125:. pp. 467–474. 658: 489:Merge space overhead 214:{\displaystyle O(n)} 196: 147: 125:{\displaystyle O(n)} 107: 58: 1760:Topological sorting 1522:Cartesian tree sort 1162:on 28 January 2016. 732:formal verification 711:Formal verification 23: 1650:Interpolation sort 1625:American flag sort 1618:Distribution sorts 1599:Cascade merge sort 1369:Sorting algorithms 1156:Python source code 703:It is superior to 682: 617: 572: 552:exponential search 536: 499: 457:| > | 436:| > | 404: 394:| > | 372:| > | 211: 171: 122: 82: 21: 1811: 1810: 1786:Impractical sorts 1248:978-3-319-21689-8 1095:doc.rust-lang.org 246:sorting algorithm 232: 231: 31:Sorting algorithm 1836: 1824:Comparison sorts 1719:Block merge sort 1679:Concurrent sorts 1578:Patience sorting 1362: 1355: 1348: 1339: 1338: 1307: 1286: 1281: 1275: 1274: 1272: 1270: 1259: 1253: 1252: 1232: 1221: 1212: 1211: 1209: 1207: 1192: 1186: 1185: 1183: 1181: 1170: 1164: 1163: 1148: 1137: 1136: 1116: 1110: 1109: 1103: 1101: 1087: 1081: 1080: 1078: 1076: 1061: 1055: 1054: 1052: 1050: 1036: 1030: 1029: 1024: 1022: 1007: 1001: 1000: 998: 996: 987:. Archived from 977: 971: 970: 968: 966: 952: 946: 945: 943: 941: 926: 917: 916: 906: 896: 880: 874: 873: 865: 856: 855: 850: 848: 825: 807: 801: 800: 794: 792: 777: 755: 754: 748: 747: 744: 698:adaptive sorting 695: 691: 689: 688: 683: 654:, Timsort takes 607:Minimum run size 462: 456: 447: 441: 435: 401: 399: 393: 385: 383: 377: 371: 355: 353: 347: 341: 270:Android platform 220: 218: 217: 212: 189:space complexity 180: 178: 177: 172: 131: 129: 128: 123: 91: 89: 88: 83: 24: 20: 1844: 1843: 1839: 1838: 1837: 1835: 1834: 1833: 1814: 1813: 1812: 1807: 1781: 1772:Pancake sorting 1748: 1705: 1674: 1655:Pigeonhole sort 1613: 1582: 1546:Insertion sorts 1541: 1527:Tournament sort 1499:Selection sorts 1493: 1447: 1428:Integer sorting 1423:Sorting network 1413:Comparison sort 1371: 1366: 1328: 1294: 1292:Further reading 1289: 1282: 1278: 1268: 1266: 1260: 1256: 1249: 1230: 1222: 1215: 1205: 1203: 1193: 1189: 1179: 1177: 1171: 1167: 1150: 1149: 1140: 1133: 1117: 1113: 1099: 1097: 1089: 1088: 1084: 1074: 1072: 1063: 1062: 1058: 1048: 1046: 1038: 1037: 1033: 1020: 1018: 1009: 1008: 1004: 994: 992: 991:on 16 July 2015 979: 978: 974: 964: 962: 954: 953: 949: 939: 937: 927: 920: 881: 877: 866: 859: 846: 844: 834: 813:[DROPS] 808: 804: 790: 788: 778: 774: 770: 752: 750: 745: 742: 740: 713: 693: 659: 656: 655: 648: 609: 600: 598:Descending runs 528: 520: 518:Merge direction 491: 466: 458: 452: 443: 442:| + | 437: 431: 395: 389: 387: 379: 378:| + | 373: 367: 365: 349: 348:| + | 343: 342:| ≤ | 337: 335: 324: 309:merge criterion 297: 248:, derived from 197: 194: 193: 148: 145: 144: 108: 105: 104: 59: 56: 55: 17: 12: 11: 5: 1842: 1832: 1831: 1826: 1809: 1808: 1806: 1805: 1800: 1795: 1789: 1787: 1783: 1782: 1780: 1779: 1777:Spaghetti sort 1774: 1769: 1768: 1767: 1756: 1754: 1750: 1749: 1747: 1746: 1741: 1736: 1731: 1726: 1721: 1715: 1713: 1707: 1706: 1704: 1703: 1698: 1693: 1688: 1686:Bitonic sorter 1682: 1680: 1676: 1675: 1673: 1672: 1667: 1662: 1657: 1652: 1647: 1642: 1637: 1632: 1627: 1621: 1619: 1615: 1614: 1612: 1611: 1606: 1601: 1596: 1590: 1588: 1584: 1583: 1581: 1580: 1575: 1570: 1565: 1560: 1555: 1553:Insertion sort 1549: 1547: 1543: 1542: 1540: 1539: 1537:Weak-heap sort 1534: 1529: 1524: 1519: 1514: 1509: 1507:Selection sort 1503: 1501: 1495: 1494: 1492: 1491: 1486: 1481: 1476: 1471: 1466: 1461: 1455: 1453: 1452:Exchange sorts 1449: 1448: 1446: 1445: 1440: 1435: 1430: 1425: 1420: 1415: 1410: 1405: 1400: 1395: 1390: 1388:Big O notation 1385: 1379: 1377: 1373: 1372: 1365: 1364: 1357: 1350: 1342: 1336: 1335: 1327: 1326:External links 1324: 1323: 1322: 1315: 1308: 1293: 1290: 1288: 1287: 1276: 1254: 1247: 1213: 1197:"listsort.txt" 1187: 1165: 1152:"listsort.txt" 1138: 1131: 1111: 1091:"slice - Rust" 1082: 1056: 1031: 1002: 972: 960:JDK Bug System 947: 918: 875: 872:. SIGMOD/PODS. 857: 832: 802: 771: 769: 766: 712: 709: 681: 678: 675: 672: 669: 666: 663: 647: 644: 608: 605: 599: 596: 527: 524: 519: 516: 490: 487: 465: 464: 449: 427: 323: 322:Merge criteria 320: 316:insertion sort 296: 293: 254:insertion sort 230: 229: 226: 222: 221: 210: 207: 204: 201: 191: 182: 181: 170: 167: 164: 161: 158: 155: 152: 142: 133: 132: 121: 118: 115: 112: 102: 93: 92: 81: 78: 75: 72: 69: 66: 63: 53: 44: 43: 38: 37:Data structure 34: 33: 28: 15: 9: 6: 4: 3: 2: 1841: 1830: 1827: 1825: 1822: 1821: 1819: 1804: 1801: 1799: 1796: 1794: 1791: 1790: 1788: 1784: 1778: 1775: 1773: 1770: 1766: 1763: 1762: 1761: 1758: 1757: 1755: 1751: 1745: 1742: 1740: 1737: 1735: 1732: 1730: 1727: 1725: 1722: 1720: 1717: 1716: 1714: 1712: 1708: 1702: 1699: 1697: 1694: 1692: 1689: 1687: 1684: 1683: 1681: 1677: 1671: 1668: 1666: 1663: 1661: 1658: 1656: 1653: 1651: 1648: 1646: 1645:Counting sort 1643: 1641: 1638: 1636: 1633: 1631: 1628: 1626: 1623: 1622: 1620: 1616: 1610: 1607: 1605: 1602: 1600: 1597: 1595: 1592: 1591: 1589: 1585: 1579: 1576: 1574: 1571: 1569: 1566: 1564: 1561: 1559: 1556: 1554: 1551: 1550: 1548: 1544: 1538: 1535: 1533: 1530: 1528: 1525: 1523: 1520: 1518: 1515: 1513: 1510: 1508: 1505: 1504: 1502: 1500: 1496: 1490: 1487: 1485: 1482: 1480: 1477: 1475: 1472: 1470: 1469:Odd–even sort 1467: 1465: 1462: 1460: 1457: 1456: 1454: 1450: 1444: 1441: 1439: 1436: 1434: 1433:X + Y sorting 1431: 1429: 1426: 1424: 1421: 1419: 1418:Adaptive sort 1416: 1414: 1411: 1409: 1406: 1404: 1401: 1399: 1396: 1394: 1391: 1389: 1386: 1384: 1381: 1380: 1378: 1374: 1370: 1363: 1358: 1356: 1351: 1349: 1344: 1343: 1340: 1333: 1330: 1329: 1320: 1316: 1313: 1309: 1305: 1301: 1296: 1295: 1285: 1280: 1265: 1258: 1250: 1244: 1240: 1236: 1229: 1228: 1220: 1218: 1202: 1198: 1195:Peters, Tim. 1191: 1176: 1169: 1161: 1157: 1153: 1147: 1145: 1143: 1134: 1132:0-89871-313-7 1128: 1124: 1123: 1115: 1108: 1096: 1092: 1086: 1071:. 4 July 2019 1070: 1066: 1060: 1045: 1041: 1035: 1028: 1016: 1012: 1006: 990: 986: 982: 976: 961: 957: 951: 936: 932: 929:James, Mike. 925: 923: 914: 910: 905: 900: 895: 890: 886: 879: 871: 864: 862: 854: 843: 839: 835: 833:9783959770811 829: 824: 819: 815: 814: 806: 799: 787: 783: 776: 772: 765: 763: 757: 736: 733: 729: 725: 720: 716: 708: 706: 701: 699: 676: 673: 670: 667: 661: 653: 643: 641: 637: 633: 629: 625: 623: 613: 604: 595: 593: 589: 585: 581: 580:binary search 577: 576:linear search 568: 564: 562: 557: 553: 549: 545: 541: 532: 523: 515: 511: 508: 507:binary search 503: 495: 486: 484: 479: 475: 471: 461: 455: 450: 446: 440: 434: 429: 428: 426: 424: 420: 416: 411: 407: 398: 392: 382: 376: 370: 363: 359: 352: 346: 340: 333: 328: 319: 317: 312: 310: 306: 302: 292: 289: 287: 283: 279: 275: 271: 267: 263: 259: 255: 251: 247: 244: 240: 236: 227: 223: 205: 199: 192: 190: 187: 183: 165: 162: 159: 156: 150: 143: 141: 138: 134: 116: 110: 103: 101: 98: 94: 76: 73: 70: 67: 61: 54: 52: 49: 45: 42: 39: 35: 32: 29: 25: 19: 1829:Stable sorts 1728: 1711:Hybrid sorts 1660:Proxmap sort 1573:Library sort 1443:Quantum sort 1304:hal-01212839 1303: 1279: 1267:. Retrieved 1257: 1226: 1204:. Retrieved 1200: 1190: 1178:. Retrieved 1168: 1160:the original 1155: 1121: 1114: 1105: 1098:. Retrieved 1094: 1085: 1073:. Retrieved 1069:Swift Forums 1068: 1059: 1047:. Retrieved 1043: 1034: 1026: 1019:. Retrieved 1014: 1005: 993:. Retrieved 989:the original 984: 975: 963:. Retrieved 959: 950: 938:. Retrieved 935:I Programmer 934: 884: 878: 869: 852: 845:. Retrieved 812: 805: 796: 789:. Retrieved 785: 775: 761: 758: 737: 723: 721: 717: 714: 702: 649: 639: 635: 631: 627: 626: 621: 618: 601: 591: 587: 583: 573: 560: 555: 547: 543: 539: 537: 521: 512: 504: 500: 483:cache memory 477: 473: 469: 467: 459: 453: 444: 438: 432: 422: 418: 414: 412: 408: 405: 396: 390: 380: 374: 368: 361: 357: 350: 344: 338: 313: 305:natural runs 304: 300: 298: 290: 234: 233: 18: 1793:Stooge sort 1635:Bucket sort 1587:Merge sorts 1459:Bubble sort 1403:Inplacement 1393:Total order 1332:timsort.txt 1314:. ESA 2018. 1049:21 December 1021:18 February 995:24 February 847:1 September 791:24 February 700:algorithm. 140:performance 100:performance 51:performance 1818:Categories 1739:Spreadsort 1701:Samplesort 1665:Radix sort 1594:Merge sort 1532:Cycle sort 1517:Smoothsort 1479:Gnome sort 1321:SODA 2019. 1206:5 December 1180:5 December 1100:8 December 894:1805.04154 768:References 652:worst case 592:min_gallop 588:min_gallop 584:min_gallop 544:min_gallop 388:ii. | 274:GNU Octave 258:Tim Peters 250:merge sort 186:Worst-case 48:Worst-case 1734:Introsort 1670:Flashsort 1640:Burstsort 1630:Bead sort 1568:Tree sort 1563:Splaysort 1558:Shellsort 1489:Quicksort 1474:Comb sort 1408:Stability 730:tool for 705:Quicksort 674:⁡ 366:i. | 295:Operation 268:, on the 266:Java SE 7 163:⁡ 97:Best-case 74:⁡ 1803:Bogosort 1798:Slowsort 1512:Heapsort 1107:another. 913:21678081 842:44091254 646:Analysis 1729:Timsort 965:11 June 940:21 June 650:In the 356:, then 235:Timsort 225:Optimal 137:Average 22:Timsort 1376:Theory 1245:  1129:  1075:4 July 1044:v8.dev 911:  840:  830:  640:minrun 636:minrun 632:minrun 628:Minrun 622:minrun 463:| 451:| 448:| 430:| 400:| 384:| 354:| 336:| 243:stable 239:hybrid 1753:Other 1398:Lists 1269:6 May 1231:(PDF) 909:S2CID 889:arXiv 838:S2CID 756:(2)) 724:every 334:. If 332:stack 282:Swift 276:, on 272:, in 237:is a 41:Array 27:Class 1271:2017 1243:ISBN 1208:2019 1182:2015 1127:ISBN 1102:2022 1077:2019 1051:2018 1023:2013 997:2011 967:2014 942:2024 849:2018 828:ISBN 793:2011 762:four 386:and 360:and 301:runs 286:Rust 252:and 1235:doi 899:doi 818:doi 753:536 746:864 743:108 728:KeY 671:log 476:or 160:log 71:log 1820:: 1302:. 1241:. 1216:^ 1199:. 1154:. 1141:^ 1104:. 1093:. 1067:. 1042:. 1025:. 1013:. 983:. 958:. 933:. 921:^ 907:. 897:. 860:^ 851:. 836:. 826:. 816:. 795:. 784:. 751:65 741:67 421:, 417:, 288:. 280:, 278:V8 241:, 228:No 1361:e 1354:t 1347:v 1306:. 1273:. 1251:. 1237:: 1210:. 1184:. 1135:. 1079:. 1053:. 999:. 969:. 944:. 915:. 901:: 891:: 820:: 694:n 680:) 677:n 668:n 665:( 662:O 561:x 556:k 548:x 542:( 478:Z 474:X 470:Y 460:X 454:Y 445:X 439:Y 433:Z 423:Z 419:Y 415:X 402:. 397:X 391:Y 381:X 375:Y 369:Z 362:Y 358:X 351:X 345:Y 339:Z 209:) 206:n 203:( 200:O 169:) 166:n 157:n 154:( 151:O 120:) 117:n 114:( 111:O 80:) 77:n 68:n 65:( 62:O

Index

Sorting algorithm
Array
Worst-case
performance
Best-case
performance
Average
performance
Worst-case
space complexity
hybrid
stable
sorting algorithm
merge sort
insertion sort
Tim Peters
Python programming language
Java SE 7
Android platform
GNU Octave
V8
Swift
Rust
merge criterion
insertion sort

stack
cache memory

binary search

Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.