How it works
Splits into three parts instead of two. Slightly fewer comparisons than standard merge sort in theory.
Implementation
function merge3Sort(arr, lo = 0, hi = arr.length) { if (hi - lo < 2) return; const t = Math.max(1, Math.floor((hi - lo) / 3)); merge3Sort(arr, lo, lo + t); merge3Sort(arr, lo + t, lo + 2*t); merge3Sort(arr, lo + 2*t, hi); // 3-way merge of three sorted runs const a = arr.slice(lo, lo+t); const b = arr.slice(lo+t, lo+2*t); const c = arr.slice(lo+2*t, hi); // merge a, b, c back into arr[lo..hi] }
def merge3_sort(arr, lo=0, hi=None): if hi is None: hi = len(arr) if hi - lo < 2: return t = max(1, (hi - lo) // 3) merge3_sort(arr, lo, lo + t) merge3_sort(arr, lo + t, lo + 2*t) merge3_sort(arr, lo + 2*t, hi) # 3-way merge of three sorted runs a = arr[lo:lo+t] b = arr[lo+t:lo+2*t] c = arr[lo+2*t:hi] # merge a, b, c back into arr[lo:hi]
void merge3Sort(vector<int>& arr, int lo, int hi) { if (hi - lo < 2) return; int t = max(1, (hi - lo) / 3); merge3Sort(arr, lo, lo + t); merge3Sort(arr, lo + t, lo + 2*t); merge3Sort(arr, lo + 2*t, hi); // 3-way merge the three sorted runs }
void Merge3Sort(int[] arr, int lo, int hi) { if (hi - lo < 2) return; int t = Math.Max(1, (hi - lo) / 3); Merge3Sort(arr, lo, lo + t); Merge3Sort(arr, lo + t, lo + 2*t); Merge3Sort(arr, lo + 2*t, hi); // 3-way merge the three sorted runs }
void merge3Sort(int arr[], int lo, int hi) { if (hi - lo < 2) return; int t = (hi - lo) / 3; if (t < 1) t = 1; merge3Sort(arr, lo, lo + t); merge3Sort(arr, lo + t, lo + 2*t); merge3Sort(arr, lo + 2*t, hi); // 3-way merge the three sorted runs }