Quick Sort — Practice Tasks¶
All in Go, Java, Python.
Beginner¶
Task 1: Lomuto Partition Quick Sort¶
Task 2: Hoare Partition Quick Sort¶
Task 3: Random Pivot¶
Task 4: Median-of-Three¶
def median_of_three(arr, lo, hi):
# TODO: return index of median of arr[lo], arr[mid], arr[hi]
return 0
Task 5: Iterative (Stack-Based) Quick Sort¶
Intermediate¶
Task 6: 3-Way Partition (Dutch Flag)¶
Task 7: Hybrid with Insertion Cutoff¶
CUTOFF = 16
def hybrid_quick_sort(arr, lo=0, hi=None):
if hi is None: hi = len(arr) - 1
if hi - lo < CUTOFF:
# insertion sort range
return
# quick sort
Task 8: Quickselect¶
Task 9: Top-K via Quickselect¶
Task 10: Tail-Recursion Optimization¶
Advanced¶
Task 11: Introsort (Quick + Heap Fallback)¶
import math, heapq
def introsort(arr):
max_depth = 2 * int(math.log2(max(len(arr), 1)))
# TODO: track depth; switch to heap_sort when depth=0
Task 12: Dual-Pivot Quicksort¶
def dual_pivot_quicksort(arr, lo=0, hi=None):
# TODO: pick two pivots p1 ≤ p2; partition into 3 regions
pass
Task 13: Parallel Quick Sort¶
Go¶
import "sync"
func ParallelQuickSort(arr []int) {
if len(arr) < 10000 { QuickSort(arr); return }
p := partition(arr, 0, len(arr)-1)
var wg sync.WaitGroup
wg.Add(2)
// TODO: sort halves in goroutines
wg.Wait()
}
Task 14: Median-of-Medians (Deterministic Linear Selection)¶
Task 15: Multi-Key Quicksort for Strings¶
Benchmark¶
Compare on n=10⁶ random ints: - Vanilla Quick Sort (first as pivot) - Random pivot - Median-of-three - 3-way partition - Hybrid (cutoff=16) - Pdqsort (built-in)
Expected: Pdqsort 4× faster than vanilla random pivot. First-as-pivot may DNF on sorted input.