How it works
Randomly shuffles the array and checks if sorted. Expected time is factorial. Also known as "stupid sort" or "monkey sort". Use with very small arrays only.
Implementation
function bogoSort(arr, stats) { const n = arr.length; function insertionSort() { for (let i = 1; i < n; i++) { const key = arr[i]; let j = i - 1; while (j >= 0) { compare(j, i); if (arr[j] <= key) break; arr[j + 1] = arr[j]; swap(j + 1, j); j--; } arr[j + 1] = key; write(j + 1, key); } } if (n > 10) { insertionSort(); return; } function isSorted() { for (let i = 1; i < n; i++) { compare(i - 1, i); if (arr[i - 1] > arr[i]) return false; } return true; } function shuffle() { for (let i = n - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } } let attempts = 0; while (!isSorted()) { shuffle(); attempts++; swap(Math.floor(Math.random() * n), Math.floor(Math.random() * n)); if (attempts > 50000) { insertionSort(); return; } } }
def bogoSort(arr, stats): def insertionSort(): for i in range(1, n): key = arr[i] j = (i - 1) while (j >= 0): compare(j, i) if (arr[j] <= key): break arr[(j + 1)] = arr[j] swap((j + 1), j) j -= 1 arr[(j + 1)] = key write((j + 1), key) def isSorted(): for i in range(1, n): compare((i - 1), i) if (arr[(i - 1)] > arr[i]): return False return True def shuffle(): for i in range((n - 1), 0, -1): j = int((random() * (i + 1))) arr[i], arr[j] = arr[j], arr[i] if (n > 10): insertionSort() return attempts = 0 while not isSorted(): shuffle() attempts += 1 swap(int((random() * n)), int((random() * n))) if (attempts > 50000): insertionSort() return
#include <vector> #include <algorithm> #include <cmath> void insertionSort(); int isSorted(); void shuffle(); void insertionSort() { for(int i=1; i<n; i++) { int key = arr[i]; int j = (i - 1); while((j >= 0)) { compare(j, i); if((arr[j] <= key)) { break; } arr[(j + 1)] = arr[j]; swap((j + 1), j); j--; } arr[(j + 1)] = key; write((j + 1), key); } } int isSorted() { for(int i=1; i<n; i++) { compare((i - 1), i); if((arr[(i - 1)] > arr[i])) { return 0; } } return 1; } void shuffle() { for(int i=(n - 1); i>0; i--) { int j = (int)std::floor((std::random() * (i + 1))); std::swap(arr[i], arr[j]); } } void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { if((n > 10)) { insertionSort(); return; } int attempts = 0; while(!isSorted()) { shuffle(); attempts++; swap((int)std::floor((std::random() * n)), (int)std::floor((std::random() * n))); if((attempts > 50000)) { insertionSort(); return; } } }
void insertionSort() { for(int i=1; i<n; i++) { int key = arr[i]; int j = (i - 1); while((j >= 0)) { compare(j, i); if((arr[j] <= key)) { break; } arr[(j + 1)] = arr[j]; swap((j + 1), j); j--; } arr[(j + 1)] = key; write((j + 1), key); } } int isSorted() { for(int i=1; i<n; i++) { compare((i - 1), i); if((arr[(i - 1)] > arr[i])) { return false; } } return true; } void shuffle() { for(int i=(n - 1); i>0; i--) { int j = (int)Math.Floor((double)(random() * (i + 1))); { int _t = arr[i]; arr[i] = arr[j]; arr[j] = _t; } } } public void Sort(int[] arr, int n, dynamic stats) { if((n > 10)) { insertionSort(); return; } int attempts = 0; while(!isSorted()) { shuffle(); attempts++; swap((int)Math.Floor((double)(random() * n)), (int)Math.Floor((double)(random() * n))); if((attempts > 50000)) { insertionSort(); return; } } }
#include <stdio.h> #include <math.h> void insertionSort(); int isSorted(); void shuffle(); void insertionSort() { for(int i=1; i<n; i++) { int key = arr[i]; int j = (i - 1); while((j >= 0)) { compare(j, i); if((arr[j] <= key)) { break; } arr[(j + 1)] = arr[j]; swap((j + 1), j); j--; } arr[(j + 1)] = key; write((j + 1), key); } } int isSorted() { for(int i=1; i<n; i++) { compare((i - 1), i); if((arr[(i - 1)] > arr[i])) { return 0; } } return 1; } void shuffle() { for(int i=(n - 1); i>0; i--) { int j = (int)floor((random() * (i + 1))); { int _t = arr[i]; arr[i] = arr[j]; arr[j] = _t; } } } void sort(int arr[], int n, int* comparisons, int* swaps) { if((n > 10)) { insertionSort(); return; } int attempts = 0; while(!isSorted()) { shuffle(); attempts++; swap((int)floor((random() * n)), (int)floor((random() * n))); if((attempts > 50000)) { insertionSort(); return; } } }