#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define swap(x,y,t) {(t)=(x);(x)=(y);(y)=(t);}
long int v[1000000];
long int L[1000000];
long int R[1000000];
void quickSort(int e[],int n)
{
    if(n<=1) return;
    int temp;
    int L,R;
    int pivot = e[0];
    int num = 0;
    L = 1;
    R = n-1;
    while(L!=R)
    {
        while((e[R] > pivot)&&( L < R))
            R--;
        while((e[L] <= pivot )&&( L < R))
            L++;
        if( L < R)
        {
            num++;
            swap(e[L],e[R],temp);
        }
    }
        if(e[R] <= pivot)
        {
            num++;
            swap(e[0],e[R],temp);
        }
        if( num == 0)
        {
            quickSort( e + 1, n - 1);
            return ;
        }
        quickSort( e , R);
        quickSort( e + R +1,n - R - 1);

}
void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];
    i = 0;
    k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        }
        else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}
void mergeSort(int arr[], int l, int r)
{
    if (l < r) {
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}
void heapify(int arr[], int n, int i)
{
    int temp;
    int largest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    if (l < n && arr[l] > arr[largest])
        largest = l;
    if (r < n && arr[r] > arr[largest])
        largest = r;
    if (largest != i) {
        swap(arr[i], arr[largest],temp);
        heapify(arr, n, largest);
    }
}
void heapSort(int arr[], int n)
{
    int temp;
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);
    for (int i = n - 1; i > 0; i--) {
        swap(arr[0], arr[i],temp);
        heapify(arr, i, 0);
    }
}

int main()
{
    clock_t start,end;
    srand(time(NULL));
    int i=0;
	while( i < 1000000 )
	{
		v[i]=rand()*rand();
		if(v[i]==0)
		{
			continue;
		}
		i++;
	} 
    start = clock();
    quickSort(v,1000000);
    end   = clock();
    double total =((double)(end-start)) / CLOCKS_PER_SEC;
    printf("quickSort time:%f\n",total);
    start = clock();
    mergeSort(v,0,999999);
    end   = clock();
    total =((double)(end-start)) / CLOCKS_PER_SEC;
    printf("mergeSort time:%f\n",total);
    start = clock();
    heapSort(v,1000000);
    end   = clock();
    total =((double)(end-start)) / CLOCKS_PER_SEC;
    printf("heapSort time:%f\n",total);
    return 0;
}