#include<stdio.h>
int a[100];
int n;
void quicksort( int left,int right );
int main()
{
int i,j;
scanf( "%d",&n );
for( i = 0;i < n;i++ )
{
scanf( "%d",&a[i] ); //输入数据
}
quicksort( 0,n-1 ); //快排
for( i = 0;i < n;i++ )
{
printf( "%d ",a[i] );
}
printf( "\n" );
return 0;
}
void quicksort( int left,int right )
{
int i,j,t,tmp;
if( left > right )
{
return ;
}
tmp = a[ left ]; //将最左元素当做比较基准
i = left;
j = right;
while( i != j )
{
while( a[j] >= tmp && i < j ) //一定是j先移动
{
j--;
}
while( a[i] <= tmp && i < j )
{
i++;
}
if( i < j )
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[ left ] = a[i]; //基准归位
a[i] = tmp;
quicksort( left,i-1 );
quicksort( i+1,right );
return ;
}
为什么一定是j先移动呢?
例如:2 5 3
a[ left ] 是2,i 指向5,j 指向3,如果i先移动,就会破坏i < j 的条件
这样本来你这次交换应该是i 指向2不变,但是j 先移动就会将2 5交换了