#include<iostream>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
void QuikSort ( int *a, int left, int right );
int findpos( int *a, int left, int right );
void swap( int *a, int *b );
int main ()
{
//int a[]={5,3,4,43,45,54,2,1,3,4};
//int n=sizeof(a)/sizeof(int);
int n;
clock_t start;
clock_t finish;
srand((unsigned int)time(0));
scanf("%d", &n);
int *a=new int [n];
for( int i=0; i<n; ++i )
a[i] = rand()%(10000007);
// for( int i=0 ;i<n; ++i )
// scanf("%d", &a[i]);
start = clock();
QuikSort(a, 0, n-1);
finish = clock();
cout<< (double)(finish - start) / CLOCKS_PER_SEC << endl;
// printf("%d", a[0]);
// for( int i=1; i<n; ++i )
// printf(" %d", a[i] );
// delete [] a;
return 0;
}
void QuikSort ( int *a, int left, int right )
{
int i=left, j=right;
if( left < right )
{
int pos = findpos( a, left, right );
QuikSort( a, left, pos-1 );
QuikSort( a, pos+1, right );
}
}
int findpos( int *a, int left, int right )
{
//取中间的数值
// int mid = (left+right)/2;
// swap(&a[mid], &a[right]);
//随机数
int index=rand()%(right-left+1)+left;
swap(&a[index], &a[right]);
int pivot=a[right];
int curpos=left;
for( int i=left; i<right; ++i )
{
if( a[i]<pivot )
{
swap(&a[curpos], &a[i]);
curpos++;
}
}
swap(&a[curpos], &a[right]);
return curpos;
}
void swap( int *a, int *b )
{
int tmp;
tmp=*a; *a=*b; *b=tmp;
}
根据随机快排原理,实现得到数组中第k大的的数
void FindKthNum ( int *a, int left, int right, int k )
{
int i=left, j=right;
if( left < right )
{
int pos = findpos( a, left, right, );
if( pos < k )
QuikSort( a, pos+1, right );
else if( pos > k )
QuikSort( a, left, pos-1 );
}
}
int findpos( int *a, int left, int right )
{
//随机数
int index=rand()%(right-left+1)+left;
swap(&a[index], &a[right]);
int pivot=a[right];
int curpos=left;
for( int i=left; i<right; ++i )
{
if( a[i]<pivot )
{
swap(&a[curpos], &a[i]);
curpos++;
}
}
swap(&a[curpos], &a[right]);
return curpos;
}