How it works
Hybrid of merge sort and insertion sort. Finds natural runs, extends them, and merges with a sophisticated merge strategy. Used by Python and Java.
Implementation
function timSort(arr) { const RUN = 32; for (let i = 0; i < arr.length; i += RUN) insertionSort(arr, i, Math.min(i+RUN-1, arr.length-1)); for (let sz = RUN; sz < arr.length; sz *= 2) for (let l = 0; l < arr.length; l += 2*sz) { let m = Math.min(l+sz-1, arr.length-1); let r = Math.min(l+2*sz-1, arr.length-1); if (m < r) merge(arr, l, m, r); } }
def tim_sort(arr): RUN = 32 for i in range(0, len(arr), RUN): insertion_sort(arr, i, min(i+RUN-1, len(arr)-1)) sz = RUN while sz < len(arr): for l in range(0, len(arr), 2*sz): m = min(l+sz-1, len(arr)-1) r = min(l+2*sz-1, len(arr)-1) if m < r: merge(arr, l, m, r) sz *= 2
void timSort(vector<int>& arr) { const int RUN = 32; int n = arr.size(); for (int i = 0; i < n; i += RUN) insertionSort(arr, i, min(i+RUN-1, n-1)); for (int sz = RUN; sz < n; sz *= 2) for (int l = 0; l < n; l += 2*sz) { int m = min(l+sz-1, n-1); int r = min(l+2*sz-1, n-1); if (m < r) merge(arr, l, m, r); } }
void TimSort(int[] arr) { const int RUN = 32; for (int i = 0; i < arr.Length; i += RUN) InsertionSort(arr, i, Math.Min(i+RUN-1, arr.Length-1)); for (int sz = RUN; sz < arr.Length; sz *= 2) for (int l = 0; l < arr.Length; l += 2*sz) { int m = Math.Min(l+sz-1, arr.Length-1); int r = Math.Min(l+2*sz-1, arr.Length-1); if (m < r) Merge(arr, l, m, r); } }
void timSort(int arr[], int n) { int RUN = 32; for (int i = 0; i < n; i += RUN) insertionSort(arr, i, i+RUN-1 < n-1 ? i+RUN-1 : n-1); for (int sz = RUN; sz < n; sz *= 2) for (int l = 0; l < n; l += 2*sz) { int m = l+sz-1 < n-1 ? l+sz-1 : n-1; int r = l+2*sz-1 < n-1 ? l+2*sz-1 : n-1; if (m < r) merge(arr, l, m, r); } }