How it works
Insertion sort with binary search for insertion points, reducing comparisons while keeping shifts.
Implementation
function binaryInsertionSort(arr, stats) { const n = arr.length; for (let i = 1; i < n; i++) { const key = arr[i]; let left = 0; let right = i; while (left < right) { const mid = left + right >> 1; compare(mid, i); if (arr[mid] <= key) left = mid + 1; else right = mid; } for (let j = i; j > left; j--) { arr[j] = arr[j - 1]; write(j, arr[j]); } arr[left] = key; write(left, key); } }
def sort(arr, n, stats): for i in range(1, n): key = arr[i] left = 0 right = i while (left < right): mid = ((left + right) >> 1) if (arr[mid] <= key): left = (mid + 1) else: right = mid for j in range(i, left, -1): arr[j] = arr[(j - 1)] arr[left] = key
#include <vector> #include <algorithm> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { for(int i=1; (i < n); i++) { int key = arr[i]; int left = 0; int right = i; while((left < right)) { int mid = ((left + right) >> 1); if((arr[mid] <= key)) { left = (mid + 1); } else { right = mid; } } for(int j=i; (j > left); j--) { arr[j] = arr[(j - 1)]; } arr[left] = key; } }
public void Sort(int[] arr, int n, dynamic stats) { for(int i=1; (i < n); i++) { int key = arr[i]; int left = 0; int right = i; while((left < right)) { int mid = ((left + right) >> 1); if((arr[mid] <= key)) { left = (mid + 1); } else { right = mid; } } for(int j=i; (j > left); j--) { arr[j] = arr[(j - 1)]; } arr[left] = key; } }
#include <stdio.h> void sort(int arr[], int n, int* comparisons, int* swaps) { for(int i=1; (i < n); i++) { int key = arr[i]; int left = 0; int right = i; while((left < right)) { int mid = ((left + right) >> 1); if((arr[mid] <= key)) { left = (mid + 1); } else { right = mid; } } for(int j=i; (j > left); j--) { arr[j] = arr[(j - 1)]; } arr[left] = key; } }