/* *Author: immortal-j *Implementation Details *Quick sort 3 works on Dutch National Flag Algorithm *The major diffrence between simple quicksort and quick sort 3 comes in the *function partition3 In quick_sort_partition3 we divide the vector/array into 3 *parts. quick sort 3 works faster in some cases as compared to simple quicksort. */ #include // function to swap elements void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } // function to print an array void print_arr(int arr[], int n) { for (int i = 0; i < n; ++i){ std::cout << arr[i] << " "; } std::cout << "\n"; } /* This function partitions arr[] in three parts *a) arr[l..i] contains all elements smaller than pivot *b) arr[i+1..j-1] contains all occurrences of pivot *c) arr[j..r] contains all elements greater than pivot */ void partition3(int arr[], int low, int high, int *i, int *j) { // To handle 2 elements if (high - low <= 1) { if (arr[high] < arr[low]){ swap(&arr[high], &arr[low]); } *i = low; *j = high; return; } int mid = low; int pivot = arr[high]; while (mid <= high) { if (arr[mid] < pivot){ swap(&arr[low++], &arr[mid++]); } else if (arr[mid] == pivot){ mid++; } else if (arr[mid] > pivot){ swap(&arr[mid], &arr[high--]); } } // update i and j *i = low - 1; *j = mid; // or high-1 } // 3-way partition based quick sort void quicksort(int arr[], int low, int high) { if (low >= high){ // 1 or 0 elements return; } int i, j; // i and j are passed as reference partition3(arr, low, high, &i, &j); // Recur two halves quicksort(arr, low, i); quicksort(arr, j, high); } // Driver program for above functions int main() { int size, i; std::cout << "Enter Number of elements\n"; std::cin >> size; int *arr = new int[size]; for (i = 0; i < size; i++) { std::cin >> arr[i]; } quicksort(arr, 0, size - 1); std::cout << "Sorted Array is:"; print_arr(arr, size); std::cout << "\n"; return 0; }