快速排序

基本思路:通过一次分割,将无序序列分成两部分,其中一部分的元素值均不大于后一部分的元素值。然后用同样的方法对每一部分进行分割,一直到每一个子序列的长度小于或等于1为止。

具体过程:设序列P进行分割。首先,从第一个、中间一个、最后一个元素中选出中项,设为P[k],并将P[k]赋给t,再将序列中的第一个元素移到P[k]的位置上。然后,再设两个指针i、j分别指向起始和最后位置上:(1)将i逐渐增大,与此同时比较P[i]与t的大小,直到发现P[i]>t,将P[i]移到P[j]的位置上;(2)将j逐渐减小,与此同时比较P[j]与t的大小,直到发现P[j]<t,将P[j]移到P[i]的位置上;直到i=j为止,这时将t移到P[i]的位置上。最后就得到了排序结果。

    C函数如下:

void prqck(p,n)

int n;double p[];

{

 int m,i0,*i;

 double *s;

 void rsplit();

 i=&i0;

 if(n>1)

   {

    rsplit(p,n,i);

    m=i0;prqck(p,m);

    s=p+(i0+1);m=n-(i0+1);prqck(s,m);

    }

 return;

}

static void rsplit(p,n,m)

int n,*m;double[];

{

 int i,j,k,l;

 double t;

 i=0;j=n-1;k=(i+j)/2;

 if((p[i]>=p[j])&&(p[j]>=p[k])) l=j;

    else if((p[i]>=p[k])&&(p[k]>=p[j])) l=k;

 else l=i;

 t=p[l];p[l]=p[i];

 while(i!=j)

      {

       while((i<j)&&(p[j]>=t)) j=j-1;

             if(i<j)

                {

                 p[i]=p[j];i=i+1;

                 while((i<j)&&(p[j]<=t)) i=i-1;

                       if(i<j)

                          {p[j]=p[i];j=j-1;}

                  }

         }

 p[i]=t;*m=i;

 return;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值