快速排序的简单实现

快速排序为什么能快呢?

  结合分治的策略,在快速排序中当挑出一个基准元素用来分成两部分即大于基准元素和小于基准元素。每次以这种效率分好,显而易见若我们取的基准每次都能恰好的是整个待排序元素的中心。

  T(n)=T(n/2)+T(n/2)+O(n)

此递归解易得出 T(n)=O(nlgn)

而最差的情况下

  T(n)=T(n-1)+T(0)+O(n)

此时T(n)=O(n^2)


很明显的差距,如何选好一个基准对于快排来说直接关乎其效率。

下面用最简单的方式实现一下快速排序,思想是一致的不同的只是选取基准元素的方式不一样,此处采取最简单的:每次固定取带排序的最后一个元素。


            
        int partition(int *A,int p,int r)
        {
          int temp=A[r-1];
          int i=p,j=p;
          for(;j<r-1;j++)
          {
              if(A[j]<temp)
              {
                 swap(A[i],A[j]);
                 i++;
              }
          }
          swap(A[i],A[r-1]);
        }
        void qsort(int *A,int p,int r)
        {
               
               if(p<r)
               {
                  int q=partition(A,p,r);
                  qsort(A,p,q-1);
                  qsort(A,q+1,r);          
                }
         }
       


若要是快速排序的效率增高的话,可以使用一个粗略的中位数的方式,即遍历一遍取个差不多中间的数或者直接取随机数也可以。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值