快速排序代码

快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分两步处理:
分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
代码如下:
template < class  T >
void  Swap(T  & a, T  & b)
{
    T t;
    t 
=  a;
    a 
=  b;
    b 
=  t;
}

int  Median3( int  a[],  int  start,  int  end)
{
    
int  mid  =  (start + end) / 2 ;
    
if (a[start] > a[mid])
        Swap(a[start],a[mid]);
    
if (a[mid] > a[end])
        Swap(a[mid], a[end]);
    
if (a[start] > a[mid])
        Swap(a[start], a[mid]);

    Swap(a[mid], a[end
- 1 ]);
    
return  a[end - 1 ];
}

void  QuickSort( int  a[],  int  start,  int  end)
{
    
static   const   int  CUTOFF  =   16 ;
    
if (end - start < CUTOFF)
    {
        InsertionSort(a, start, end);
        
return ;
    }

    
int  m  =  Median3(a, start, end);
    
int  i  =  start;
    
int  j  =  end  -   1 ;

    
while ( true )
    {
        
while (a[ ++ i] < m);
        
while (a[ -- j] > m);
        
if (i < j)
            Swap(a[i], a[j]);
        
else
            
break ;
    }
    Swap(a[i], a[end
- 1 ]);
    QuickSort(a, start, i
- 1 );
    QuickSort(a, i
+ 1 , end);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值