#include <iostream>
#include <math.h>
#include <cstdlib>
using namespace std;
int partition(int array[], int arrStart, int pivotPos, int arrEnd) {
int arrayLen = arrEnd - arrStart;
int pivotValue = array[pivotPos];
array[pivotPos] = array[arrEnd - 1];
int i = 0;
int temp;
for (int j = arrStart; j < arrEnd - 1; ++j)
{
if (array[j] < pivotValue) {
temp = array[arrStart + i];
array[arrStart + i] = array[j];
array[j] = temp;
++i;
}
}
array[arrEnd - 1] = array[arrStart + i];
array[arrStart + i] = pivotValue;
return arrStart + i;
}
bool quickSort(int array[], int arrStart, int arrEnd) {
int arrLen = arrEnd - arrStart;
if (arrLen == 0 || arrLen == 1) {
return true;
}
srand(array[arrStart] + arrLen + array[arrEnd - 1]);
int pivotPos = arrStart + floor(((arrLen - 1) + (size_t)rand()) % (arrLen - 1));
int pivotOrderedPos = partition(array, arrStart, pivotPos, arrEnd);
quickSort(array, arrStart, pivotOrderedPos);
quickSort(array, pivotPosOrdered+1, arrEnd);
return true;
}
void printArray(int array[], int arrLen) {
for (int i = 0; i < arrLen; ++i) {
cout << array[i] << " ";
}
cout << endl;
}
int main(){
int array0[] = {};
int arrayLen = sizeof(array0)/sizeof(int);
printArray(array0, arrayLen);
quickSort(array0, 0, arrayLen);
printArray(array0, arrayLen);
cout << "=========================================" << endl;
int array1[] = {1};
arrayLen = sizeof(array1)/sizeof(int);
printArray(array1, arrayLen);
quickSort(array1, 0, arrayLen);
printArray(array1, arrayLen);
cout << "=========================================" << endl;
int array2[] = {2, 1};
arrayLen = sizeof(array2)/sizeof(int);
printArray(array2, arrayLen);
quickSort(array2, 0, arrayLen);
printArray(array2, arrayLen);
cout << "=========================================" << endl;
int array3[] = {1, 5, 3};
arrayLen = sizeof(array3)/sizeof(int);
printArray(array3, arrayLen);
quickSort(array3, 0, arrayLen);
printArray(array3, arrayLen);
cout << "=========================================" << endl;
int array4[] = {9, 12, 8, 7};
arrayLen = sizeof(array4)/sizeof(int);
printArray(array4, arrayLen);
quickSort(array4, 0, arrayLen);
printArray(array4, arrayLen);
cout << "=========================================" << endl;
int array5[] = {9, 12, 8, 7, 3};
arrayLen = sizeof(array5)/sizeof(int);
printArray(array5, arrayLen);
quickSort(array5, 0, arrayLen);
printArray(array5, arrayLen);
}