快速排序(转自nocow)

收藏用

(言过其实了,C++ STL的Sort实现用的是Introsort,是快速排序的变种,主要是递归过深的时候自动转换为堆排或插入排序(是堆排还是插入排序还要视具体实现而定),可以保证最坏情况下还是O(nlogn),并且充分使用了尾递归优化(快排最后不是两个递归吗?最后一个递归可以不必真的递归,可以像gcd算法一样通过迭代参数来改善运行速度),STL快排可以经受任何实践的考验,而这段代码在最坏情况下还是O(n^2)) -- by 某奋战的OIer

此代码经过了一个多月的极致优化,测试。近乎完美。

本人觉得直接将template T直接换成int,long之类爽快些!


<template T>
void sort(T a[],T st,T ed)
{ if(st<ed)   //先设一个开关优化,会更快一些
  { T tmp=a[st],i=st,j=ed;
    while(i<j)
    { while(a[j]>tmp&&i<j) --j;  //C++在判断时,会打开编译开关,把a[j]与tmp放在前比较,这样会更快一些~~
      if(i<j) a[i++]=a[j]; //ps:j-- ,i++(下行)比不了--j,++i快
      while(a[i]<tmp&&i<j) ++i;//注意:这里用的不是">="或"<="而是">""<,事实证明,前者会增加交换的次数,做无用功~~~
      if(i<j) a[j--]=a[i];
    }  //while
      a[i]=tmp;
      sort(a,st,i-1);
      sort(a,i+1,ed);
   }  //if
   //这里不用return语句,会快一些
}  
 //由于以上的种种,程序在大的排序中(N>=10e6)优势越来越大--By LinuxKernel


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值