您的位置:首页 > 其它

快速排序

2017-12-20 21:51 134 查看
#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交换了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: