Discover how two simple tricks can turn a messy pile into a perfectly sorted deck in no time!
Why Quick Sort Partition Lomuto and Hoare in DSA C?
Imagine you have a messy pile of playing cards and you want to sort them by number. You try to pick cards one by one and place them in order by comparing each card with all others manually.
This manual sorting is slow and confusing because you keep losing track of which cards you already checked. It takes a lot of time and mistakes happen easily when you try to remember all the comparisons.
Quick Sort uses a smart way to split the pile into smaller piles around a chosen card (pivot). Lomuto and Hoare are two clever methods to do this splitting quickly and correctly, making sorting much faster and easier.
for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } }
int partition(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++;
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
}
}
int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp;
return i + 1;
}It enables fast and efficient sorting of large lists by breaking the problem into smaller parts and sorting them quickly.
Sorting a list of student scores quickly to find the top performers without checking every score against all others manually.
Manual sorting is slow and error-prone for large data.
Quick Sort partitioning splits data efficiently around a pivot.
Lomuto and Hoare are two smart ways to do this partitioning.
Practice
Solution
Step 1: Understand Lomuto partition
Lomuto partition uses a single pointer to track the boundary of smaller elements and swaps elements accordingly.Step 2: Understand Hoare partition
Hoare partition uses two pointers starting from both ends moving inward to swap elements that are on the wrong side.Final Answer:
Lomuto uses one pointer, Hoare uses two pointers moving inward -> Option CQuick Check:
Pointer count difference = A [OK]
- Confusing sorting order difference
- Thinking both use same pointer method
- Assuming Hoare uses recursion only
Solution
Step 1: Check parameter types
Array must be passed as int arr[], and low and high as int indices.Step 2: Check return type
Lomuto partition returns an int index, so return type must be int.Final Answer:
int lomutoPartition(int arr[], int low, int high); -> Option AQuick Check:
Correct signature = A [OK]
- Using void return type instead of int
- Passing array as int arr instead of int arr[]
- Swapping low and high parameters
arr = [8, 3, 7, 6, 2] with low=0 and high=4?Solution
Step 1: Choose pivot and initialize pointers
Pivot is arr[high] = 2. Initialize i = low - 1 = -1.Step 2: Iterate and swap elements smaller than pivot
Traverse j from 0 to 3:
- j=0: arr[0]=8 > 2, no swap
- j=1: arr[1]=3 > 2, no swap
- j=2: arr[2]=7 > 2, no swap
- j=3: arr[3]=6 > 2, no swap
After loop, swap arr[i+1]=arr[0] and pivot arr[4]=2.Final Answer:
[2, 3, 6, 7, 8] -> Option DQuick Check:
Pivot 2 placed at start = A [OK]
- Swapping elements incorrectly with pivot
- Using wrong pivot index
- Confusing i and j pointers
int hoarePartition(int arr[], int low, int high) {
int pivot = arr[low];
int i = low - 1, j = high + 1;
while (1) {
do { i++; } while (arr[i] < pivot);
do { j--; } while (arr[j] > pivot);
if (i >= j) return j;
swap(&arr[i], &arr[j]);
}
}Solution
Step 1: Examine the swap call
The code callsswap(&arr[i], &arr[j]);but theswapfunction is not defined in the snippet, causing a compilation error.Step 2: Verify other components
Pointer initializationi=low-1, j=high+1is correct for do-while structure; pivot at low ok; returnjstandard.Final Answer:
Swap function is missing -> Option BQuick Check:
Undefined swap function = C [OK]
- Missing swap function definition
- Confusing Hoare pointer initialization
- Returning wrong index after partition
[10, 80, 30, 90, 40, 50, 70], what is the final array after applying Hoare partition with low=0 and high=6?Solution
Step 1: Initialize pointers and pivot
Pivot = arr[low] = 10, i = low - 1 = -1, j = high + 1 = 7.Step 2: Move pointers
do { i++; } while (arr[i] < 10); i++ to 0, arr[0]=10 not < 10, i=0.
do { j--; } while (arr[j] > 10); j-- from 7: 6(70>10),5(50>10),4(40>10),3(90>10),2(30>10),1(80>10),0(10 not >10), j=0.
i=0 >= j=0, return 0. No swap.Final Answer:
[10, 80, 30, 90, 40, 50, 70] -> Option AQuick Check:
Array unchanged (all ≥ pivot) = D [OK]
- Assuming full sort after one partition
- Confusing pivot position after partition
- Mis-tracing pointer movements
Ready to prove it?
Pass the test and this pattern moves unknown
