Sorting
Quick Sort (Lomuto)
Choose the last item as a pivot, partition smaller values to its left, then recurse on the two sides.
Algorithm
The checked-in replay follows the same small input and final output across all 21 DSA books, so this Swift DSA implementation can be compared directly with the other languages.
pivot
The final element is moved to the boundary between smaller and larger values.
partition
One scan rearranges the current range before the recursive calls.
Visual walkthrough
Basic Implementation
basic.swift
func partition(_ arr: inout [Int], _ low: Int, _ high: Int) -> Int {
let pivot = arr[high]
var i = low - 1
for j in low..<high {
if arr[j] <= pivot {
i += 1
arr.swapAt(i, j)
}
}
arr.swapAt(i + 1, high)
return i + 1
}
func quickSort(_ arr: inout [Int], _ low: Int, _ high: Int) {
if low < high {
let pivotIndex = partition(&arr, low, high)
quickSort(&arr, low, pivotIndex - 1)
quickSort(&arr, pivotIndex + 1, high)
}
}
var arr = [4, 1, 5, 2, 3]
quickSort(&arr, 0, arr.count - 1)
print(arr)
Complexity
- Time: O(n^2) worst, O(n log n) average
- Space: O(log n) average call stack
- Stable: no
Implementation notes
partition(_ arr: inout [Int], _ low: Int, _ high: Int) -> Intmutates the caller's Swift[Int]throughinout;quickSort(&arr, 0, arr.count - 1)passes the same array variable byinout. SwiftArrayis a value type with copy-on-write storage, and this source mutates it throughswapAtwithout explicitly allocating a replacement array.- The pivot is
let pivot = arr[high], so each partition uses the current high-bound element as an immutableIntcomparison value. var i = low - 1tracks the last slot on the left side, whilefor j in low..<highscans only the elements before the pivot.- Values satisfying
arr[j] <= pivotincrementiand callarr.swapAt(i, j); after the scan,arr.swapAt(i + 1, high)places the pivot and returnsi + 1. quickSortrecurses only whenlow < high, then calls the left rangelow...pivotIndex - 1and right rangepivotIndex + 1...high.- The trace starts from
[4, 1, 5, 2, 3]: comparing4and5against pivot3leaves them on the right, while1and2swap left to produce[1, 2, 5, 4, 3]. - The pivot swap moves
3into index2, yielding[1, 2, 3, 4, 5]; the replay then records already-sorted left[1, 2]and right[4, 5]recursions. print(arr)uses Swift's array display form and outputs[1, 2, 3, 4, 5].