#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANDOM_RANGE 10000
void generateRandom(int **arr, int size)
{
if (*arr == NULL)
*arr = (int *)malloc(sizeof(int) * size);
int *ptr = *arr;
for (int i = 0; i < size; i++)
{
ptr[i] = rand() % RANDOM_RANGE;
}
}
void displayArr(int *arr, int size)
{
if (arr != NULL)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
}
void QuickSort(int *A, int left, int right){
// i,j temp variables, temp, temp1 use for swap
int tmp1, tmp2, tmp3, temp, center;
int i, j, temp1, pivot;
if(left >= right) {
return;
}
// median 3 begin
// at last tmp1>tmp2>tmp3
center = (right+left)/2;
tmp1 = A[left];
tmp2 = A[center];
tmp3 = A[right];
if (tmp1 < tmp2){
temp = tmp2;
tmp2 = tmp1;
tmp1 = temp;
}
if (tmp1 < tmp3) {
temp = tmp3;
tmp3 = tmp1;
tmp1 = temp;
}
if (tmp2 < tmp3) {
temp = tmp3;
tmp3 = tmp2;
tmp2 = temp;
}
A[left] = tmp3;
A[right] = tmp1;
//处理边界条件
if ((right-left) == 1){
if (A[left]>A[right]) {
temp = A[right];
A[right] = A[left];
A[left] = temp;
}
return;
} else {
if (right == left) return;
}
A[center] = A[right-1];
A[right-1] = tmp2;
i = left+1;
j = right-2;
pivot = tmp2;
while(1) {
while(A[i] < pivot) {
i++;
}
while(A[j] > pivot) {
j--;
}
if(i < j) {
temp1 = A[j];
A[j] = A[i];
A[i] = temp1;
i++;
j--;
} else break;
}
temp1 = A[i];
A[i] = A[right-1];
A[right-1] = temp1;
pivot = temp1;
//sort left part
QuickSort(A,left,i-1);
// sort right part
QuickSort(A,i+1,right);
}
int main(int argc, char const *argv[])
{
srand(0);
clock_t start, stop;
double duration;
//use small size array to test
int size = 10;
int *A1 = NULL;
generateRandom(&A1, size);
printf("Values before QuickSort:\n");
displayArr(A1, size);
QuickSort(A1, 0, size-1);
printf("Values after QuickSort:\n");
displayArr(A1, size);
free(A1);
A1 = NULL;
//test large array time used
size = 50000;
generateRandom(&A1, size);
printf("Values before QuickSort:\n");
displayArr(A1, 20);
start = clock();
QuickSort(A1, 0, size - 1);
stop = clock();
// running time in ms
duration = ((double)(stop - start)) / CLK_TCK*1000.0;
printf("Values after QuickSort:\n");
displayArr(A1, 20);
printf("\nTime used:%f ms",duration);
return 0;
}