How it works
Hybrid stable approach using square-root-sized buffers and blockwise merging.
Implementation
function sqrtSort(arr, stats) { const n = arr.length; if (n < 2) return; const block = Math.max(2, Math.floor(Math.sqrt(n))); for (let lo = 0; lo < n; lo += block) { const hi = Math.min(lo + block, n); for (let i = lo + 1; i < hi; i++) { const key = arr[i]; let j = i - 1; while (j >= lo && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } const temp = new Array(n).fill(0); for (let width = block; width < n; width *= 2) { for (let lo = 0; lo < n; lo += 2 * width) { const mid = Math.min(lo + width, n); const hi = Math.min(lo + 2 * width, n); if (mid >= hi) continue; let i = lo; let j = mid; let k = lo; while (i < mid && j < hi) { if (arr[i] <= arr[j]) { temp[k] = arr[i]; i++; } else { temp[k] = arr[j]; j++; } k++; } while (i < mid) { temp[k] = arr[i]; i++; k++; } while (j < hi) { temp[k] = arr[j]; j++; k++; } for (let p = lo; p < hi; p++) { arr[p] = temp[p]; } } } }
def sort(arr, n, stats): if (n < 2): return block = max(2, int(int(n ** 0.5))) for lo in range(0, n, block): hi = min((lo + block), n) for i in range((lo + 1), hi): key = arr[i] j = (i - 1) while ((j >= lo) and (arr[j] > key)): arr[(j + 1)] = arr[j] j -= 1 arr[(j + 1)] = key temp = [0] * n width = block while (width < n): for lo in range(0, n, (2 * width)): mid = min((lo + width), n) hi = min((lo + (2 * width)), n) if (mid >= hi): continue i = lo j = mid k = lo while ((i < mid) and (j < hi)): if (arr[i] <= arr[j]): temp[k] = arr[i] i += 1 else: temp[k] = arr[j] j += 1 k += 1 while (i < mid): temp[k] = arr[i] i += 1 k += 1 while (j < hi): temp[k] = arr[j] j += 1 k += 1 for p in range(lo, hi): arr[p] = temp[p] width *= 2
#include <vector> #include <algorithm> #include <cmath> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { if((n < 2)) { return; } int block = ((2) > ((int)std::floor((int)std::sqrt(n))) ? (2) : ((int)std::floor((int)std::sqrt(n)))); for(int lo=0; lo<n; lo+=block) { int hi = (((lo + block)) < (n) ? ((lo + block)) : (n)); for(int i=(lo + 1); i<hi; i++) { int key = arr[i]; int j = (i - 1); while(((j >= lo) && (arr[j] > key))) { arr[(j + 1)] = arr[j]; j--; } arr[(j + 1)] = key; } } std::vector<int> temp(n, 0); for(int width=block; (width < n); width *= 2) { for(int lo=0; lo<n; lo+=(2 * width)) { int mid = (((lo + width)) < (n) ? ((lo + width)) : (n)); int hi = (((lo + (2 * width))) < (n) ? ((lo + (2 * width))) : (n)); if((mid >= hi)) { continue; } int i = lo; int j = mid; int k = lo; while(((i < mid) && (j < hi))) { if((arr[i] <= arr[j])) { temp[k] = arr[i]; i++; } else { temp[k] = arr[j]; j++; } k++; } while((i < mid)) { temp[k] = arr[i]; i++; k++; } while((j < hi)) { temp[k] = arr[j]; j++; k++; } for(int p=lo; p<hi; p++) { arr[p] = temp[p]; } } } }
public void Sort(int[] arr, int n, dynamic stats) { if((n < 2)) { return; } int block = Math.Max(2, (int)Math.Floor((double)(int)Math.Sqrt(n))); for(int lo=0; lo<n; lo+=block) { int hi = Math.Min((lo + block), n); for(int i=(lo + 1); i<hi; i++) { int key = arr[i]; int j = (i - 1); while(((j >= lo) && (arr[j] > key))) { arr[(j + 1)] = arr[j]; j--; } arr[(j + 1)] = key; } } int[] temp = new int[n]; for(int width=block; (width < n); width *= 2) { for(int lo=0; lo<n; lo+=(2 * width)) { int mid = Math.Min((lo + width), n); int hi = Math.Min((lo + (2 * width)), n); if((mid >= hi)) { continue; } int i = lo; int j = mid; int k = lo; while(((i < mid) && (j < hi))) { if((arr[i] <= arr[j])) { temp[k] = arr[i]; i++; } else { temp[k] = arr[j]; j++; } k++; } while((i < mid)) { temp[k] = arr[i]; i++; k++; } while((j < hi)) { temp[k] = arr[j]; j++; k++; } for(int p=lo; p<hi; p++) { arr[p] = temp[p]; } } } }
#include <stdio.h> #include <string.h> #include <math.h> void sort(int arr[], int n, int* comparisons, int* swaps) { if((n < 2)) { return; } int block = ((2) > ((int)floor((int)sqrt(n))) ? (2) : ((int)floor((int)sqrt(n)))); for(int lo=0; lo<n; lo+=block) { int hi = (((lo + block)) < (n) ? ((lo + block)) : (n)); for(int i=(lo + 1); i<hi; i++) { int key = arr[i]; int j = (i - 1); while(((j >= lo) && (arr[j] > key))) { arr[(j + 1)] = arr[j]; j--; } arr[(j + 1)] = key; } } int temp[n]; memset(temp, 0, sizeof(temp)); for(int width=block; (width < n); width *= 2) { for(int lo=0; lo<n; lo+=(2 * width)) { int mid = (((lo + width)) < (n) ? ((lo + width)) : (n)); int hi = (((lo + (2 * width))) < (n) ? ((lo + (2 * width))) : (n)); if((mid >= hi)) { continue; } int i = lo; int j = mid; int k = lo; while(((i < mid) && (j < hi))) { if((arr[i] <= arr[j])) { temp[k] = arr[i]; i++; } else { temp[k] = arr[j]; j++; } k++; } while((i < mid)) { temp[k] = arr[i]; i++; k++; } while((j < hi)) { temp[k] = arr[j]; j++; k++; } for(int p=lo; p<hi; p++) { arr[p] = temp[p]; } } } }