快速排序代码

快速排序的基本思想是基于分治策略的。对于输入的子序列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、付费专栏及课程。

余额充值