#include <iostream>
#include <math.h>
#include <cstdlib>
using namespace std;
void printArray(int array[], int arrLen) {
for (int i = 0; i < arrLen; ++i) {
cout << array[i] << " ";
}
cout << endl;
}
void printArray1(int array[], int arrStart, int arrEnd) {
for (int i = arrStart; i < arrEnd; ++i) {
cout << array[i] << " ";
}
cout << endl;
}
int partition(int array[], int arrStart, int arrEnd, int pivotPos) {
int arrayLen = arrEnd - arrStart;
if ( arrayLen < 1 || pivotPos < arrStart || pivotPos >= arrEnd) {
cout << "Please check your implementation." << endl;
return -1;
}
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;
}
int findPivotPos(int array[], int arrStart, int arrEnd) {
int arrLen = arrEnd - arrStart;
int mid = arrStart + arrLen/2;
int min = arrStart;
int max = arrEnd - 1;
if (array[min] > array[mid]) {
int temp = min;
min = mid;
mid = temp;
}
if (array[mid] > array[max]) {
int temp = mid;
mid = max;
max = mid;
}
if (array[min] > array[mid]){
int temp = min;
min = mid;
mid = temp;
}
return mid;
}
bool quickSort(int array[], int arrStart, int arrEnd) {
int arrLen = arrEnd - arrStart;
if (arrLen < 0) {
cout << "Please check your input." << endl;
return false;
}
if (arrLen == 0 || arrLen == 1) {
return true;
}
int pivotPos = findPivotPos(array, arrStart, arrEnd);
int pivotOrderedPos = partition(array, arrStart, arrEnd, pivotPos);
cout << "pos " << pivotPos << endl;
cout << "ordered pos " << pivotOrderedPos << endl;
printArray1(array, arrStart, pivotOrderedPos);
printArray1(array, pivotOrderedPos, arrEnd);
quickSort(array, arrStart, pivotOrderedPos);
quickSort(array, pivotOrderedPos, arrEnd);
return true;
}
int main(){
int array0[] = {};
int arrayLen = sizeof(array0)/sizeof(int);
int array5[] = {11,8,3,9,7,1,2,5};
arrayLen = sizeof(array5)/sizeof(int);
printArray(array5, arrayLen);
quickSort(array5, 0, arrayLen);
printArray(array5, arrayLen);
}