快速排序

#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交换了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值