void quick(int *data ,int begin,int end);
int find_mid(int *data, int i, int j, int k);
int exchange(int *data, int a, int b);
int main()
{
int buf[10] = {10,3,2,10,545,13,12123,5,6,2};
int buf1[2]= {45,3};
quick(buf,0,9);
for (int i=0; i<10;i++)
{
printf("%d\n",buf[i]);
}
}
int exchange(int *data, int a, int b)
{int tmp = 0;
tmp = data[a];
data[a]=data[b];
data[b]=tmp;
}
int find_mid(int *data, int i, int j, int k)
{
int big = data[i]>data[j]?i:j;
if (data[k] >= data[big])
return big;
if (data[k] >= data[i] || data[k] >= data[j])
return k;
if (data[i] == big)
return j;
else
return i;
}
void quick(int *data, int begin, int end)
{
if (begin >= end)
return;
int mid = find_mid(data,begin,begin+(end-begin)/2,end);
exchange(data,begin,mid);
int i = begin+1, j = end;
while( i <= j)
{
while( data[i] <= data[mid] && i < j )
{
i++;
}
while( data[j] >= data[mid] && j >= i)
{
j--;
}
if ( i >= j)
break;
exchange(data,i,j);
}
exchange(data,j,begin);
quick(data,begin,j-1);
quick(data,j+1,end);
}