Here we will see the quicksort technique but we will use three-way quicksort. The basic quicksort technique is just finding an element as pivot then partition the array around pivot, after that, recur for sub arrays on left and right of the pivot.
The three-way quicksort is similar, but there are three sections. array arr[1 to n] is divided into three parts.
- arr[1 to i]
- arr[i + 1, j]
- arr[j + 1, n]
Algorithm
partition(arr, left, right, i, j) −
begin if right – left <= 1, then if arr[right] < arr[left], then swap arr[right] and arr[left] i := left j := right return end if mid := left, pivot = arr[right] while mid <= right, do if arr[mid] < pivot, then swap arr[left], arr[mid] increase left and mid by 1 else if arr[mid] = pivot, then increase mid by 1 else swap arr[mid], arr[right] decrease right by 1 done i := left – 1 j := mid end
quicksort(arr, left, right) −
begin if left >= right, then return end if define i and j partition(arr, left, right, i, j) quicksort(arr, left, i) quicksort(arr, j, right) end
Example
#include<iostream> #include<vector> using namespace std; void partition(int arr[], int left, int right, int &i, int &j) { if (right - left <= 1) { if (arr[right] < arr[left]) swap(arr[right], arr[left]); i = left; j = right; return; } int mid = left; int pivot = arr[right]; while (mid <= right) { if (arr[mid]<pivot) swap(arr[left++], arr[mid++]); else if (arr[mid]==pivot) mid++; else if (arr[mid] > pivot) swap(arr[mid], arr[right--]); } i = left-1; j = mid; } void quicksort(int arr[], int left, int right) { if (left >= right) //1 or 0 elements return; int i, j; partition(arr, left, right, i, j); quicksort(arr, left, i); quicksort(arr, j, right); } void display(int arr[], int n) { for (int i = 0; i < n; ++i) cout << " " << arr[i]; cout << endl; } int main() { int a[] = {4, 9, 4, 3, 1, 9, 4, 3, 9, 4, 3, 1, 4}; int n = sizeof(a) / sizeof(int); display(a, n); quicksort(a, 0, n - 1); display(a, n); }
Output
4 9 4 3 1 9 4 3 9 4 3 1 4 1 1 3 3 3 4 4 4 4 4 9 9 9