How it works
Iterative merge sort that merges runs of doubling size without recursion.
Implementation
function bottomUpMergeSort(arr, stats) { const n = arr.length; const tmp = new Array(n); for (let width = 1; width < n; width <<= 1) { for (let left = 0; left < n; left += width << 1) { const mid = Math.min(left + width, n); const right = Math.min(left + (width << 1), n); let i = left; let j = mid; let k = left; while (i < mid && j < right) { compare(i, j); if (arr[i] <= arr[j]) tmp[k++] = arr[i++]; else tmp[k++] = arr[j++]; } while (i < mid) { tmp[k++] = arr[i++]; } while (j < right) { tmp[k++] = arr[j++]; } for (let p = left; p < right; p++) { arr[p] = tmp[p]; write(p, arr[p]); } } } }
def sort(arr, n, stats): tmp = [0] * n width = 1 while (width < n): left = 0 while (left < n): mid = min((left + width), n) right = min((left + (width << 1)), n) i = left j = mid k = left while ((i < mid) and (j < right)): if (arr[i] <= arr[j]): tmp[k] = arr[i] k += 1 i += 1 else: tmp[k] = arr[j] k += 1 j += 1 while (i < mid): tmp[k] = arr[i] k += 1 i += 1 while (j < right): tmp[k] = arr[j] k += 1 j += 1 for p in range(left, right): arr[p] = tmp[p] left += (width << 1) width <<= 1
#include <vector> #include <algorithm> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { std::vector<int> tmp(n); for(int width=1; (width < n); width <<= 1) { for(int left=0; (left < n); left += (width << 1)) { int mid = (((left + width)) < (n) ? ((left + width)) : (n)); int right = (((left + (width << 1))) < (n) ? ((left + (width << 1))) : (n)); int i = left; int j = mid; int k = left; while(((i < mid) && (j < right))) { if((arr[i] <= arr[j])) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while((i < mid)) { tmp[k++] = arr[i++]; } while((j < right)) { tmp[k++] = arr[j++]; } for(int p=left; (p < right); p++) { arr[p] = tmp[p]; } } } }
public void Sort(int[] arr, int n, dynamic stats) { int[] tmp = new int[n]; for(int width=1; (width < n); width <<= 1) { for(int left=0; (left < n); left += (width << 1)) { int mid = (((left + width)) < (n) ? ((left + width)) : (n)); int right = (((left + (width << 1))) < (n) ? ((left + (width << 1))) : (n)); int i = left; int j = mid; int k = left; while(((i < mid) && (j < right))) { if((arr[i] <= arr[j])) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while((i < mid)) { tmp[k++] = arr[i++]; } while((j < right)) { tmp[k++] = arr[j++]; } for(int p=left; (p < right); p++) { arr[p] = tmp[p]; } } } }
#include <stdio.h> void sort(int arr[], int n, int* comparisons, int* swaps) { int tmp[n]; for(int width=1; (width < n); width <<= 1) { for(int left=0; (left < n); left += (width << 1)) { int mid = (((left + width)) < (n) ? ((left + width)) : (n)); int right = (((left + (width << 1))) < (n) ? ((left + (width << 1))) : (n)); int i = left; int j = mid; int k = left; while(((i < mid) && (j < right))) { if((arr[i] <= arr[j])) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while((i < mid)) { tmp[k++] = arr[i++]; } while((j < right)) { tmp[k++] = arr[j++]; } for(int p=left; (p < right); p++) { arr[p] = tmp[p]; } } } }