快速排序算法的实现

快速排序算法是在实际应用中经常用到的排序算法。STL中的sort()算法就是使用快速排序算法。快速排序算法的平均统计性能是O(nlogn)。虽然堆排序算法的平均统计性能也是O(nlogn),但快速排序算法的系数要比堆排序的要小,因此总体统计性能要优于堆排序算法。不过,快速排序算法的最差统计性能是O(n2),要差于堆排序的O(nlogn),因此在实际应用中快速排序算法的性能太差的话,也可能使用堆排序这种具有稳定统计性能的排序算法。

下面是快速排序算法的实现:

template < typename T >
void  QuickSort(T *  a,  int  l,  int  r)
{
    
int i = l, j = r;
    T x 
= a[(l + r) / 2];                       //求中间值

    
do{
        
while ((a[i] < x) && (i < r)) i++;      //从左扫描大于中值的数        
        while ((a[j] > x) && (j > l)) j--;      //从右扫描大于中值的数        
        if(i <= j) swap(a[j--], a[i++]);        //找到了一对值后进行交换
    }
while (i <= j);                            //如果两边扫描的下标交错,就停止(完成一次)
    
    
if (l < j)  QuickSort(a, l, j);            //当左边部分有值(l < j),递归左半边    
    if (i < r)  QuickSort(a, i, r);            //当右边部分有值(i < r),递归右半边
}


template
< typename T >
void  QuickSort(T *  a,  int  Count)

    QuickSort(a, 
0, Count - 1);
}

它的工作看起来象一个二叉树。首先我们选择一个中间值x,程序中我们使用数组中间值,然后把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使用这个过程(最容易的方法——递归)。注意,由于数据的随机性,对x的选择并不会影响该算法的效率。

注意,在扫描过程中,对于给定参考值,对于向右(左)扫描,如果扫描值大(小)于或等于参考值,就需要进行交换。最终得到的结果是,j左边的值都小于参考值,而i右边的值都大于参考值,j和i之间的值都等于参考值。对j左边和i右边的分别使用递归,就可以完成最终的排序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值