zoukankan      html  css  js  c++  java
  • 排序

    一个与C++库函数不相上下的QuickSort

    (言过其实了,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
  • 相关阅读:
    MyBatis Plus 导入IdType失败
    SpringBoot+Vue项目上手
    高并发
    多线程
    Java 接口
    Java后端总结
    Aliyun Linux2安装Docker
    Zookeeper集群部署及报错分析
    CentOs7配置java环境
    kafka笔记——kafka启动
  • 原文地址:https://www.cnblogs.com/caleb/p/2177384.html
Copyright © 2011-2022 走看看