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.cpp
#include <iostream>
#include <vector>
int partition(std::vector<int>& arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; ++j) {
if (arr[j] <= pivot) {
++i;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
return i + 1;
}
void quick_sort(std::vector<int>& arr, int low, int high) {
if (low < high) {
int pivot_index = partition(arr, low, high);
quick_sort(arr, low, pivot_index - 1);
quick_sort(arr, pivot_index + 1, high);
}
}
int main() {
std::vector<int> arr{4, 1, 5, 2, 3};
quick_sort(arr, 0, static_cast<int>(arr.size()) - 1);
std::cout << "[";
for (size_t i = 0; i < arr.size(); ++i) {
if (i > 0) std::cout << ", ";
std::cout << arr[i];
}
std::cout << "]" << std::endl;
return 0;
}
Complexity
- Time: O(n^2) worst, O(n log n) average
- Space: O(log n) average call stack
- Stable: no
Implementation notes
- In C++, the input is a
std::vector<int>initialized as{4, 1, 5, 2, 3}and passed by non-const reference to bothquick_sort(std::vector<int>& arr, int low, int high)andpartition. - Bounds are
intindexes. The initial call usesstatic_cast<int>(arr.size()) - 1, and recursion only continues whilelow < high. - Lomuto partition chooses
int pivot = arr[high], startsi = low - 1, and scansjfromlowtohigh - 1. Values<= pivotincrementiand swap into the left partition. - Swaps use
std::swap(arr[i], arr[j])and the finalstd::swap(arr[i + 1], arr[high]); no temporary buffer is allocated. - The trace shows pivot
3:1and2move left,4and5stay right, and the final pivot swap changes[1, 2, 5, 4, 3]to[1, 2, 3, 4, 5]. - Output is streamed with
std::cout, asize_tprint loop, comma separators, andstd::endl. Visible dynamic storage is the input vector; mutation is vector element swapping and scalar partition state across recursive calls.
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.