Quick Sort is based on the divide-and-conquer strategy. It is also called a partition exchange sort. It was developed by Tony Hoare in 1959.
Steps for Quick Sort:
- First step in Quick Sort is to choose an element called as pivot.
- Once the Pivot is selected, we need to reorder the elements so that:
- all the elements less than the Pivot are placed before Pivot,
- and elements greater than Pivot are placed after Pivot.
- With above steps, selected Pivot will be in its final position
- But, elements to left and right of Pivot are still not placed correctly
- So, above 2 steps need to be repeated for both left and right elements recursively
- Below we discuss Hoare Partition Scheme and Lomuto Partition Scheme
Hoare Partition Scheme
package com.techstackjournal;
public class HoarePartitionScheme {
public static void main(String[] args) {
int arr[] = { 16, 3, 10, 14, 64, 26, 32, 2, 94, 8 };
System.out.print("Before Sort : ");
for (int k : arr) {
System.out.print(k + " ");
}
System.out.println();
quicksort(arr, 0, arr.length - 1);
System.out.print("After Sort : ");
for (int k : arr) {
System.out.print(k + " ");
}
}
public static void quicksort(int[] arr, int lower, int upper) {
if (upper > lower) {
int t = partition(arr, lower, upper);
quicksort(arr, lower, t);
quicksort(arr, t + 1, upper);
}
}
private static int partition(int[] arr, int lower, int upper) {
int pivot, i, j, temp;
pivot = arr[(int) (upper + lower) / 2];
i = lower - 1;
j = upper + 1;
while (true) {
do {
i++;
} while (arr[i] < pivot);
do {
j--;
} while (arr[j] > pivot);
if (i >= j) {
return j;
}
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
Lomuto Partition Scheme
package com.techstackjournal;
public class LomutoPartitionScheme {
public static void main(String[] args) {
int arr[] = { 16, 3, 10, 14, 64, 26, 32, 2, 94, 8 };
System.out.print("Before Sort : ");
for (int k : arr) {
System.out.print(k + " ");
}
System.out.println();
quicksort(arr, 0, arr.length - 1);
System.out.print("After Sort : ");
for (int k : arr) {
System.out.print(k + " ");
}
}
public static void quicksort(int[] arr, int lower, int upper) {
if (upper > lower) {
int t = partition(arr, lower, upper);
quicksort(arr, lower, t - 1);
quicksort(arr, t + 1, upper);
}
}
private static int partition(int[] arr, int lower, int upper) {
int pivot, k;
k = lower;
pivot = arr[upper];
for (int j = lower; j < upper; j++) {
if (arr[j] < pivot) {
int temp = arr[k];
arr[k] = arr[j];
arr[j] = temp;
k++;
}
}
int temp = arr[k];
arr[k] = arr[upper];
arr[upper] = temp;
return k;
}
}