#pragma once #include #include using namespace std; void our_swap(auto& a, auto& b){ char temp[sizeof(a)]; memcpy(temp, &a, sizeof(a)); memcpy(&a, &b, sizeof(a)); memcpy(&b, temp, sizeof(a)); } void bubble_sort(auto& array, size_t length){ bool sorted = false; while(!sorted){ sorted = true; for(size_t i = 0; i < length - 1; i++){ // O(n) if(array[i] > array[i+1]){ our_swap(array[i], array[i+1]); sorted = false; } } } } void selection_sort(auto& array, size_t length){ size_t index_of_best_front = 0; for(size_t done_index = 0; done_index < length - 1; done_index++){ index_of_best_front = done_index; for(size_t i = done_index + 1; i < length; i++) if(array[index_of_best_front] > array[i]) index_of_best_front = i; if(done_index != index_of_best_front) our_swap(array[done_index], array[index_of_best_front]); } } void quicksort(auto* array, size_t length){ // Step 0: If the array is short, just use selection sort if(length <= 1) return; if(length < 5) { selection_sort(array, length); return; } // Step 1: choose pivot if(array[0] > array[length - 1]) our_swap(array[0], array[length - 1]); if(array[length / 2] > array[length - 1]) our_swap(array[length - 1], array[length / 2]); if(array[0] > array[length/2]) swap(array[length-1], array[0]); else swap(array[length-1], array[length/2]); // Step 2: Categorize items as less than or greater than the pivot size_t b = 0, e = length - 2, median; while(true){ for(; array[length - 1] > array[b]; b++); for(; array[e] > array[length - 1]; e--); if(e > b) { our_swap(array[b], array[e]); e--; b++; } else { median = b; break; } } // Step 3: Move the pivot back where it goes our_swap(array[median], array[length - 1]); // Step 4: Call quicksort on each half if(median) quicksort(array, median ); if(length - median) quicksort(array + median + 1, length - median - 1); }