快速排序

#include "common.h"
//快速排序
template<class Elem>
void QuickSort(Elem arr[], int nStart, int nEnd,
     Compare<Elem>& comp = Lower<Elem>())
{
    if (nStart >= nEnd) return;
/*  //优化:待排序元素个数小于10则使用插入排序
    if (nEnd - nStart < 9)             
    {
        return InsertSort(arr, nStart, nEnd, comp);
    }
*/
    int nLeft = nStart;
    int nRight = nEnd;
    int index = (nLeft + nRight) / 2;   //选取分割点
    swap(arr, index, nRight);           //将分割点暂时放到末尾
    index = nRight;                     //保存分割点位置
    --nLeft;
    //整理元素:小于分割点的放一端,其他另一端
    while(nLeft < nRight)              
    {                                   //从首尾两端同时进行
        while((++nLeft < nRight) && comp(arr[nLeft],arr[index]));
        while((nLeft < --nRight) && comp(arr[index],arr[nRight]));
        if (nLeft < nRight)
        {
            swap(arr, nLeft, nRight);
        }
    }
    swap(arr, nLeft, index);            //将分割点放置到两端的中间,即分界点
    index = nLeft;                      //整理后的分割点位置
    //子串排序
    QuickSort(arr, nStart, index - 1, comp);
    QuickSort(arr, index + 1, nEnd, comp);   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值