Sorting
Quick Sort (Lomuto)
Choose the last item as a pivot, partition smaller values to its left, then recurse on the two sides.
Algorithm
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].
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.