What do we understand about Quick Sort?
- Usually implemented recursively
- Mutates the original Array
- Similar mental model to reversing a Binary Tree
- Similar to Merge Sort
- It is a Divide & Conquer algorithm
- It comprises of 2 functions
- Main function recursively splits the Array into left and right halves
- Left and right half is determined via Array index
- 2nd helper function does the swap and returns the new pivot index
- by convention, last value is the pivot value to be compared with
- if current loop index's value is less than pivot value
- increment
- smaller to the left of the pivot
- bigger to the right of the pivot
- lastly, return the pivot point
- Best video explanation I found online:
- Time Complexity:
- Best : O(nlogn)
- Average: O(nlogn)
- Worst : O(n^2)
- Space Complexity:
- O(logn)
// 27, 18, 6, 21, 26, 24
// |
// i
// |
// pivotIndex
// |
// pivotValue
function getPivotPoint(arr, start, end) {
// by convention we always pick the last element as pivot
let pivotValue = arr[end];
// pivot index should at the end hold the larger value compared to pivot
let pivotIndex = start;
for (let i = start; i < end; i++) {
// as loing as values on the left of the pivot is smaller in value,
// we swap the index with the latest updated pivot index
if (arr[i] < pivotValue) {
if (i !== pivotIndex) {
[arr[i], arr[pivotIndex]] = [arr[pivotIndex], arr[i]];
}
pivotIndex++;
}
}
// swap the latest updated pivot index with the pivot value itself
// everything on the right is now larger value than the pivot value
[arr[end], arr[pivotIndex]] = [arr[pivotIndex], arr[end]];
// return new pivot point
return pivotIndex;
}
function QuickSort(arr, start = 0, end = arr.length - 1) {
// base case
if (end > start) {
const pivot = getPivotPoint(arr, start, end);
QuickSort(arr, start, pivot - 1); // do the pivot swap on the left
QuickSort(arr, pivot + 1, end); // do the pivot swap on the right
}
return arr;
}
Top comments (0)