快速排序(转自nocow)

来源:互联网 发布:mac的option是windows 编辑:程序博客网 时间:2024/06/05 00:59

收藏用

(言过其实了,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